我试图在Linux机器上编写一个bash脚本,在Firmware state: Rebuild上计数行数并停止,然后得到行号(例如15-1= 14,因为行号0是第一行)并将其保存在一个变量中。我不知道怎么做,所以找人帮忙。
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Rebuild
Firmware state: Online, Spun Up更新
这一直很好,直到我们发现一个问题,如果硬盘驱动器没有连接从插槽0,它不能正常工作。
[root@la43 ~]# /opt/MegaRAID/MegaCli/MegaCli64 -PDList -aALL | grep -e "Firmware state" -e "Slot"
Slot Number: 4
Firmware state: Rebuild
Slot Number: 5
Firmware state: Online, Spun Up
Slot Number: 6
Firmware state: Online, Spun Up
Slot Number: 7
Firmware state: Online, Spun Up
Slot Number: 8
Firmware state: Online, Spun Up
Slot Number: 9
Firmware state: Online, Spun Up
Slot Number: 10
Firmware state: Online, Spun Up
Slot Number: 11
Firmware state: Online, Spun Up
Slot Number: 12
Firmware state: Online, Spun Up
Slot Number: 13
Firmware state: Online, Spun Up
Slot Number: 14
Firmware state: Online, Spun Up
Slot Number: 15
Firmware state: Online, Spun Up所以我需要的是从答案中得到第四位。因此,需要获得固件状态:重新构建,即第1行,然后-1,以获得行0,然后得到插槽号4。
所以var结束时为4。
我该怎么做?
提亚
发布于 2020-03-31 09:58:06
使用awk:
$ var=$(awk '$0=="Firmware state: Rebuild"{print --NR; exit}' file)
$ echo "$var"
14当当前行等于awk并退出脚本时,Firmware state: Rebuild脚本会打印输入记录号减1。然后将命令替换$(...)的输出分配给变量var。
发布于 2020-03-31 09:47:43
这应该是你想做的事:
$ var=$(( $(grep -m1 -n 'Firmware state: Rebuild' file | cut -d: -f1) -1 ))
$ echo $var
14 grep -m1 -n 'Firmware state: Rebuild':这将搜索第一行(-m 1)匹配的Firmware state: Rebuild,并打印该行,包括其行号(-n):$ grep -m1 -n的固件状态:重构文件15:固件状态:重建cut -d: -f1:然后通过这个以:作为字段分隔符并打印第一个字段,行号的cut,输出上述grep的输出。*var=$(( $(command) -1 )):$(( ))结构允许我们执行数学运算。例如:$ echo $((10-2)) 8 $(command)构造允许我们像使用变量一样使用命令的输出。因此,$(( $(command) -1 ))将打印从command输出中减去1的结果。因为这里的command是上面的grep | cut,其输出是行号(15),这将将行号减1保存为$var。请注意,上面的解决方案还将匹配像Firmware state: Rebuild again这样的行或任何包含Firmware state: Rebuild作为子字符串的内容。如果需要确保只在整行只包含Firmware state: Rebuild时才匹配,请使用以下方法:
var=$(( $(grep -xm1 -n 'Firmware state: Rebuild' file | cut -d: -f1) -1 ))发布于 2021-07-03 12:34:08
var=$(grep -n "Firmware state: Rebuild" filename| awk -F ":" '{print $1-1}')这是一个变元的答案,使用awk而不是cut和shell算法来计算基于零的行数。
https://unix.stackexchange.com/questions/577048
复制相似问题