awk在一行中打印n个搜索结果,并添加逗号分隔符
请解释我应该如何使用awk在一行中打印n个搜索结果,并添加逗号分隔符,awk,Awk,请解释我应该如何使用awk: 我需要在raid控制器上创建前两个146G驱动器的镜像。如果显示空驱动器列表,则会得到以下结果: Smart Array P420 in Slot 5 unassigned physicaldrive 1I:1:1 (port 1I:box 1:bay 1, SAS, 146 GB, OK) physicaldrive 1I:1:2 (port 1I:box 1:bay 2, SAS, 146 GB, OK) physicaldrive 1I:1:4 (port
awk
:
我需要在raid控制器上创建前两个146G
驱动器的镜像。如果显示空驱动器列表,则会得到以下结果:
Smart Array P420 in Slot 5
unassigned
physicaldrive 1I:1:1 (port 1I:box 1:bay 1, SAS, 146 GB, OK)
physicaldrive 1I:1:2 (port 1I:box 1:bay 2, SAS, 146 GB, OK)
physicaldrive 1I:1:4 (port 1I:box 1:bay 4, SAS, 900.1 GB, OK)
physicaldrive 2I:1:5 (port 2I:box 1:bay 5, SAS, 146 GB, OK)
physicaldrive 2I:1:6 (port 2I:box 1:bay 6, SAS, 146 GB, OK)
physicaldrive 2I:1:8 (port 2I:box 1:bay 8, SAS, 900.1 GB, OK)
对于本例,我将列表放入一个文件free drives
,然后创建命令。我希望得到这样的输出:
drives=1I:1:1,1I:1:2
我的第一次尝试是
drives=$(awk '/146 GB/ { printf $2"," ;}; END{print ;}' free-drives)
但这会导致
1I:1:1,1I:1:2,2I:1:5,2I:1:6,
我找不到一个合适的方法来去掉后面的逗号,所以我用sed
来去掉它[1]
drives=$(awk '/146 GB/ { printf $2"," ;}; END{print ;}' free-drives|sed -e 's/,$//g')
我们还有4个磁盘,我需要两个。所以我尝试了一些我在书中读到的技巧,比如:
drives=$(awk 'a-->0;/146 GB/{ printf $2"," ;}{a=2}; END{print ;}' free-drives|sed -e 's?,$??g')
但这会造成一片混乱
那么,只使用一个awk
oneliner的正确方法是什么
[1] :如果你有什么建议给我如何解决这个问题:那也太好了;-) 这应该做到:
awk '/146 GB/{t=t $2 ","}; END{sub(/,$/, "", t); print t}' free-drives
输出:
1I:1:1,1I:1:2,2I:1:5,2I:1:6
这一行应该满足您的需求:
awk '/146 GB/{x++;s=s?s","$2:$2}x==2{print s;exit}' free-drivers
通过您的输入,它将输出:
1I:1:1,1I:1:2
我想您知道如何将其分配给变量,所以我跳过了该部分。Thanx Konsolebox,但该命令似乎并没有完全满足我的要求:当我进行测试时,结果看起来是这样的:1I:1:11I:1:22I:1:52I:1:6