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