数据如下所示。路径将处于活动就绪运行状态。如果没有,可以忽略那些。
[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尝试以以下格式打印。输出如下所示。
[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"}’,但它没有打印为受影响的。请帮我弄到下面。
预期产出-:
[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:~]#发布于 2022-05-24 22:30:45
OP的当前awk代码是接近的;只需要添加几个条件检查来确定何时终止一行printf调用;对OP的当前awk代码进行一些更改:
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?
'这就产生了:
dev_mig (3624a9370402ea6a5e67a4646002114g7)
sder sdep sdkh sdkj
dev_mig_temp (3624a9370402ea6a5e67a4646002114g6)
sdeo sdeq sdkg sdki发布于 2022-05-24 21:43:44
在每个Unix框上使用任何shell中的任何awk:
$ 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
}
}$ awk -f tst.awk file
dev_mig (3624a9370402ea6a5e67a4646002114g7)
sder sdep sdkh sdkj
dev_mig_temp (3624a9370402ea6a5e67a4646002114g6)
sdeo sdeq sdkg sdki发布于 2022-05-25 09:39:06
我会按下面的方式把你的代码
awk '/PURE/ {print (j++?"\n":"") $1 " " $2} /active ready running/ {printf $(NF-4) " "}'在管道命令输出后
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进入它,它会产生
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中测试)
https://stackoverflow.com/questions/72369667
复制相似问题