我正在尝试在 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)
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |