首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用awk完成模式匹配后打印新行

如何在使用awk完成模式匹配后打印新行
EN

Stack Overflow用户
提问于 2022-05-24 21:28:01
回答 3查看 161关注 0票数 0

数据如下所示。路径将处于活动就绪运行状态。如果没有,可以忽略那些。

代码语言:javascript
复制
[root@dev-vm:~]# multipath -ll
dev_mig (3624a9370402ea6a5e67a4646002114g7) dm-11 PURE,FlashArray
size=5.0T features='0' hwhandler='0' wp=rw
`-+- policy='queue-length 0' prio=1 status=active
  |- 0:0:3:2 sder 129:48 active ready running
  |- 0:0:2:2 sdep 129:16 active ready running
  |- 1:0:2:2 sdkh 66:336 active ready running
  `- 1:0:3:2 sdkj 66:368 active ready running
dev_mig_temp (3624a9370402ea6a5e67a4646002114g6) dm-10 PURE,FlashArray
size=6.0T features='0' hwhandler='0' wp=rw
`-+- policy='queue-length 0' prio=1 status=active
  |- 0:0:2:1 sdeo 129:0  active ready running
  |- 0:0:3:1 sdeq 129:32 active ready running
  |- 1:0:2:1 sdkg 66:320 active ready running
  `- 1:0:3:1 sdki 66:352 active ready running

尝试以以下格式打印。输出如下所示。

代码语言:javascript
复制
[root@dev-vm:~]# multipath -ll | awk '/PURE/ {print $1 " " $2} /active ready running/ {printf $(NF-4) " "}'
dev_mig (3624a9370402ea6a5e67a4646002114g7)
sder sdep sdkh sdkj dev_mig_temp (3624a9370402ea6a5e67a4646002114g6)
sdeo sdeq sdkg sdki [root@dev-vm:~]#

但是希望在打印完整个输出后获得一个新的行/shell提示符。尝试使用"\n“多路径-ll \NF‘/纯/ {print $1”“$2} /active就绪运行/ {printf $(NF-4) "\n"}’,但它没有打印为受影响的。请帮我弄到下面。

预期产出-:

代码语言:javascript
复制
    [root@dev-vm:~]# multipath -ll | awk '/PURE/ {print $1 " " $2} /active ready running/ {printf $(NF-4) " "}'
    dev_mig (3624a9370402ea6a5e67a4646002114g7)
    sder sdep sdkh sdkj 
    dev_mig_temp (3624a9370402ea6a5e67a4646002114g6)
    sdeo sdeq sdkg sdki 
[root@dev-vm:~]#
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-05-24 22:30:45

OP的当前awk代码是接近的;只需要添加几个条件检查来确定何时终止一行printf调用;对OP的当前awk代码进行一些更改:

代码语言:javascript
复制
awk '
/PURE/                 { if (NR>1) print ""                  # terminate previous line?
                         print $1,$2
                         pfx=""                              # reset prefix to empty string
                       }
/active ready running/ { printf "%s%s", pfx, $(NF-4)         # 1st match prints with a prefix of empty string
                         pfx=OFS                             # set prefix to OFS for rest of matches
                       }
END                    { if (pfx==OFS) print "" }            # terminate last line?
'

这就产生了:

代码语言:javascript
复制
dev_mig (3624a9370402ea6a5e67a4646002114g7)
sder sdep sdkh sdkj
dev_mig_temp (3624a9370402ea6a5e67a4646002114g6)
sdeo sdeq sdkg sdki
票数 0
EN

Stack Overflow用户

发布于 2022-05-24 21:43:44

在每个Unix框上使用任何shell中的任何awk:

代码语言:javascript
复制
$ cat tst.awk
/PURE/ {
    if ( NR>1 ) {
        prt()
    }
    cnt = 0
}
{ buf[++cnt] = $0 }
END { prt() }

function prt(   a,i,rest) {
    split(buf[1],a)
    print a[1], a[2]
    for ( i=4; i<=cnt; i++ ) {
        if ( buf[i] ~ /active ready running/ ) {
            split(buf[i],a)
            rest = (rest == "" ? "" : rest OFS) a[3]
        }
    }
    if ( rest != "" ) {
        print rest
    }
}
代码语言:javascript
复制
$ awk -f tst.awk file
dev_mig (3624a9370402ea6a5e67a4646002114g7)
sder sdep sdkh sdkj
dev_mig_temp (3624a9370402ea6a5e67a4646002114g6)
sdeo sdeq sdkg sdki
票数 1
EN

Stack Overflow用户

发布于 2022-05-25 09:39:06

我会按下面的方式把你的代码

代码语言:javascript
复制
awk '/PURE/ {print (j++?"\n":"") $1 " " $2} /active ready running/ {printf $(NF-4) " "}'

在管道命令输出后

代码语言:javascript
复制
dev_mig (3624a9370402ea6a5e67a4646002114g7) dm-11 PURE,FlashArray
size=5.0T features='0' hwhandler='0' wp=rw
`-+- policy='queue-length 0' prio=1 status=active
  |- 0:0:3:2 sder 129:48 active ready running
  |- 0:0:2:2 sdep 129:16 active ready running
  |- 1:0:2:2 sdkh 66:336 active ready running
  `- 1:0:3:2 sdkj 66:368 active ready running
dev_mig_temp (3624a9370402ea6a5e67a4646002114g6) dm-10 PURE,FlashArray
size=6.0T features='0' hwhandler='0' wp=rw
`-+- policy='queue-length 0' prio=1 status=active
  |- 0:0:2:1 sdeo 129:0  active ready running
  |- 0:0:3:1 sdeq 129:32 active ready running
  |- 1:0:2:1 sdkg 66:320 active ready running
  `- 1:0:3:1 sdki 66:352 active ready running

进入它,它会产生

代码语言:javascript
复制
dev_mig (3624a9370402ea6a5e67a4646002114g7)
sder sdep sdkh sdkj 
dev_mig_temp (3624a9370402ea6a5e67a4646002114g6)
sdeo sdeq sdkg sdki 

说明:我所做的唯一改变就是使用{print $1 " " $2}替换{print (j++?"\n":"") $1 " " $2},因此它将使用换行符取代所有的打印,但首先使用换行符。根据您的要求,在输出的第2行和第4行将有尾随的空间。为了获得期望的输出,我将所谓的三元操作符condition?valueiftrue:valueiffalse与++后面的变量组合在一起。对于第一次执行(然后使用空字符串)和1,2,3. j++值为0.用于后续执行(然后使用换行符)。免责声明:该解决方案的目的是通过对原始代码的最小修改获得所需的输出。

(在gawk 4.2.1中测试)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72369667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档