请使用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]:如果你有任何建议我如何解决这个问题:那也很好; - )。
答案 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
我想你知道如何将它分配给变量,所以我只是跳过那部分。