0

请解释我应该如何使用以下方法完成以下操作awk

我需要146G在 RAID 控制器上创建第一个两个驱动器的镜像。如果我显示空驱动器列表,我会得到以下结果:

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')

但这会产生一团糟。

那么,仅使用一个awkoneliner 执行此操作的正确方法是什么?

[1]:如果您对如何解决此问题有任何建议:那也很棒;-)。

4

2 回答 2

0

这个单线应该给你想要的:

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

根据您的输入,它会输出:

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

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

于 2013-09-13T14:37:46.417 回答
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
于 2013-09-13T14:26:17.580 回答