首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash脚本计数行

bash脚本计数行
EN

Unix & Linux用户
提问于 2020-03-31 09:24:24
回答 4查看 207关注 0票数 0

我试图在Linux机器上编写一个bash脚本,在Firmware state: Rebuild上计数行数并停止,然后得到行号(例如15-1= 14,因为行号0是第一行)并将其保存在一个变量中。我不知道怎么做,所以找人帮忙。

代码语言:javascript
复制
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,它不能正常工作。

代码语言:javascript
复制
[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。

我该怎么做?

提亚

EN

回答 4

Unix & Linux用户

发布于 2020-03-31 09:58:06

使用awk

代码语言:javascript
复制
$ var=$(awk '$0=="Firmware state: Rebuild"{print --NR; exit}' file)
$ echo "$var"
14

当当前行等于awk并退出脚本时,Firmware state: Rebuild脚本会打印输入记录号减1。然后将命令替换$(...)的输出分配给变量var

票数 7
EN

Unix & Linux用户

发布于 2020-03-31 09:47:43

这应该是你想做的事:

代码语言:javascript
复制
$ 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时才匹配,请使用以下方法:

代码语言:javascript
复制
var=$(( $(grep -xm1 -n 'Firmware state: Rebuild' file | cut -d: -f1) -1 ))
票数 5
EN

Unix & Linux用户

发布于 2021-07-03 12:34:08

代码语言:javascript
复制
var=$(grep -n "Firmware state: Rebuild" filename| awk -F ":" '{print $1-1}')

这是一个变元的答案,使用awk而不是cut和shell算法来计算基于零的行数。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/577048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档