我正在尝试在 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
Run Code Online (Sandbox Code Playgroud)
更新
这一直工作得很好,直到我们发现一个问题,如果硬盘驱动器没有从插槽 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
Run Code Online (Sandbox Code Playgroud)
所以我需要的是从答案中获得第 4 个插槽。所以需要获取固件状态:重建它是第 1 行,然后是 -1 以获取第 0 行然后获取插槽号 4
所以 var 最终是 4
我该怎么做?
TIA
与awk
:
$ var=$(awk '$0=="Firmware state: Rebuild"{print --NR; exit}' file)
$ echo "$var"
14
Run Code Online (Sandbox Code Playgroud)
该awk
脚本打印输入记录数减1时,当前行等于Firmware state: Rebuild
并退出脚本。命令替换的输出$(...)
然后分配给变量var
。
这应该做你想做的:
$ var=$(( $(grep -m1 -n 'Firmware state: Rebuild' file | cut -d: -f1) -1 ))
$ echo $var
14
Run Code Online (Sandbox Code Playgroud)
grep -m1 -n 'Firmware state: Rebuild'
:这将搜索第一 ( -m 1
) 行匹配Firmware state: Rebuild
,并打印该行,包括其行号 ( -n
):
$ grep -m1 -n 'Firmware state: Rebuild' file
15:Firmware state: Rebuild
Run Code Online (Sandbox Code Playgroud)cut -d: -f1
:的输出grep
上面,然后通过此管道cut
这需要:
作为字段分隔符,并打印所述第一字段,行号。* var=$(( $(command) -1 ))
:该$(( ))
构造让我们执行数学运算。例如:
$ echo $((10-2))
8
Run Code Online (Sandbox Code Playgroud)
该$(command)
构造让我们可以像使用变量一样使用命令的输出。因此,$(( $(command) -1 ))
将打印从 的输出中减去 1 的结果command
。由于command
这里是grep | cut
上述内容,其输出是行号 ( 15
),因此会将行号减一保存为$var
.
请注意,上面的解决方案还将匹配类似的行Firmware state: Rebuild again
或包含Firmware state: Rebuild
子字符串的任何其他内容。如果您需要确保它仅在整行不包含 but 时匹配Firmware state: Rebuild
,请改用:
var=$(( $(grep -xm1 -n 'Firmware state: Rebuild' file | cut -d: -f1) -1 ))
Run Code Online (Sandbox Code Playgroud)