awk在一行中打印n搜索结果并添加逗号分隔

时间:2013-09-13 14:19:37

标签: 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 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个磁盘,我需要两个。所以我尝试了一些我在5316572中读过的提示,就像这个:

drives=$(awk 'a-->0;/146 GB/{ printf $2"," ;}{a=2}; END{print ;}' free-drives|sed -e 's?,$??g')

但这会造成一团糟。

那么,只有一个awk oneliner?

的正确方法是什么?

[1]:如果你有任何建议我如何解决这个问题:那也很好; - )。

2 个答案:

答案 0 :(得分:0)

这应该这样做:

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

答案 1 :(得分:0)

这个单行应该给你想要的东西:

 awk '/146 GB/{x++;s=s?s","$2:$2}x==2{print s;exit}' free-drivers

输入后,输出:

1I:1:1,1I:1:2

我想你知道如何将它分配给变量,所以我只是跳过那部分。