在shell脚本中隔离字符串的子字符串

时间:2017-07-20 09:58:01

标签: regex bash shell sed

我使用lynis来审核我正在使用的AMI。在lynis运行之后,它会写入/var/log/lynis.log并提供一个"强化指数"得分以评估ami的整体强化。

我通过运行sudo cat /var/log/lynis.log | grep "Hardening Index"

获得此值

反过来又给了我这句话:

2017-07-20 10:45:10 Hardening index : [58] [###########         ]

我的问题是如何将58分配给变量以进行if语句比较。我正在考虑使用sed或regex,但因为这个值会因ami而异,并且可能在0到100之间,我不能想到一种只提取该值的方法。任何帮助,将不胜感激。

5 个答案:

答案 0 :(得分:3)

您可以使用awk,甚至可以跳过grepcat这样的内容:

awk -F '[][]+' '/Hardening [Ii]ndex/{print $2}' var/log/lynis.log
58

awk使用[]作为字段分隔符,并提取匹配Hardening [Ii]ndex正则表达式的记录的第二个字段。

将其存储在变量中:

var=$(awk -F '[][]+' '/Hardening [Ii]ndex/{print $2}' var/log/lynis.log)

答案 1 :(得分:2)

在shell中执行此操作的计算上最便宜的方法是使用POSIX parameter expansion facilities(滚动到该部分的底部)以避免产生外部进程:

round(self.d_n, 2)

答案 2 :(得分:0)

尝试:

sudo cat /var/log/lynis.log | grep "Hardening Index" | sed -r "s/.*?\[([0-9]+)\].*/\1/"

答案 3 :(得分:0)

尝试一次跟随awk。

awk '{match($0,/Harden[Ii]ng index.[^\]]*/);print substr($0,RSTART+RLENGTH-2,2)}'  Input_file

答案 4 :(得分:0)

sudo cat /var/log/lynis.log | grep "Hardening [Ii]ndex"|sed -r 's/[^[]*\[([^]]*).*/\1/'