首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在shell脚本中隔离字符串的子字符串

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

Stack Overflow用户
提问于 2017-07-20 17:58:01
回答 5查看 79关注 0票数 1

我正在使用lynis审计一些我将使用的AMI。在lynis运行之后,它将写入/var/log/lynis.log,并给出一个“硬化指数”分数来评估ami的整体硬化。

我通过运行sudo cat /var/log/lynis.log | grep "Hardening Index"获得这个值

这又给了我这一行:

代码语言:javascript
复制
2017-07-20 10:45:10 Hardening index : [58] [###########         ]

我的问题是,为了进行if语句比较,我如何隔离要分配给变量的58。我在考虑使用sed或regex,但由于这个值会根据ami的不同而不同,并且范围可能在0-100之间,所以我想不出一个直接提取该值的方法。任何帮助都将不胜感激。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-07-20 18:04:36

你可以像这样使用awk,甚至跳过你的grepcat

代码语言:javascript
复制
awk -F '[][]+' '/Hardening [Ii]ndex/{print $2}' var/log/lynis.log
58

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

要将其存储在变量中,请执行以下操作:

代码语言:javascript
复制
var=$(awk -F '[][]+' '/Hardening [Ii]ndex/{print $2}' var/log/lynis.log)
票数 2
EN

Stack Overflow用户

发布于 2017-07-20 18:03:33

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

代码语言:javascript
复制
$ var='2017-07-20 10:45:10 Hardening index : [58] [###########         ]'
$ var=${var%%\]*} #remove longest endstring starting with ] 
$ var=${var##*\[} #remove longest startstring ending with [
$ echo $var
  58
票数 2
EN

Stack Overflow用户

发布于 2017-07-20 18:10:23

尝试:

代码语言:javascript
复制
sudo cat /var/log/lynis.log | grep "Hardening Index" | sed -r "s/.*?\[([0-9]+)\].*/\1/"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45211399

复制
相关文章

相似问题

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