首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在shell脚本中分别提取两个相似或不同字符串之间的文本

在shell脚本中分别提取两个相似或不同字符串之间的文本
EN

Stack Overflow用户
提问于 2022-01-12 08:54:59
回答 3查看 144关注 0票数 1

我希望在每个###之间分别提取文本,以便与不同的文件进行比较。需要提取所有对接者图像的所有CVE编号,以便与以前的报告进行比较。文件如下所示。这是一个片段,它有100多行这样的代码。需要通过Shell脚本来完成。帮帮忙吧。

代码语言:javascript
复制
### Vulnerabilities found in docker image alarm-integrator:22.0.0-150
| CVE  | X-ray Severity | Anchore Severity | Trivy Severity | TR   |
| :--- | :------------: | :--------------: | :------------: | :--- |
|[CVE-2020-29361](#221fbde4e2e4f3dd920622768262ee64c52d1e1384da790c4ba997ce4383925e)|||Important|
|[CVE-2021-35515](#898e82a9a616cf44385ca288fc73518c0a6a20c5e0aae74ed8cf4db9e36f25ce)|||High|

### Vulnerabilities found in docker image br-agent:22.0.0-154
| CVE  | X-ray Severity | Anchore Severity | Trivy Severity | TR   |
| :--- | :------------: | :--------------: | :------------: | :--- |
|[CVE-2020-29361](#221fbde4e2e4f3dd920622768262ee64c52d1e1384da790c4ba997ce4383925e)|||Important|
|[CVE-2021-23214](#75eaa96ec256afa7bc6bc3445bab2e7c5a5750678b7cda792e3c690667eacd98)|||Important|

我试过像这样的grep -oP '(?<=\"##\").*?(?=\"##\")',但它不起作用。

预期产出:

代码语言:javascript
复制
For alarm-integrator
CVE-2020-29361
CVE-2021-35515

For br-agent
CVE-2020-29361
CVE-2021-23214
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-01-12 13:06:51

使用GNU awk (我假设您已经或可以使用GNU grep)来匹配第3 arg ():

代码语言:javascript
复制
$ cat tst.awk
match($0,/^###.* ([^:]+):.*/,a) { print "For", a[1] }
match($0,/\[([^]]+)/,a)         { print a[1] }
!NF
代码语言:javascript
复制
$ awk -f tst.awk file
For alarm-integrator
CVE-2020-29361
CVE-2021-35515

For br-agent
CVE-2020-29361
CVE-2021-23214
票数 1
EN

Stack Overflow用户

发布于 2022-01-12 10:07:22

在显示的示例中,请尝试遵循awk代码。

代码语言:javascript
复制
awk '
/^##/ && match($0,/docker image[[:space:]]+[^:]*/){
  split(substr($0,RSTART,RLENGTH),arr1)
  print "for "arr1[3]
  next
}
match($0,/^\|\[[^]]*/){
  print substr($0,RSTART+2,RLENGTH-2)
}
'  Input_file

说明:添加了对上述awk代码的详细说明。

代码语言:javascript
复制
awk '                                   ##Starting awk program from here.
/^##/ && match($0,/docker image[[:space:]]+[^:]*/){  ##Checking condition if line starts from ## AND using match function to match regex docker image[[:space:]]+[^:]* to get needed value.
  split(substr($0,RSTART,RLENGTH),arr1) ##Splitting matched part in above match function into arr1 array with default delimiter of space here.
  print "for "arr1[3]                   ##Printing string for space arr1 3rd element here
  next                                  ##next will skip all further statements from here.
}
match($0,/^\|\[[^]]*/){                 ##using match function to match starting |[ till first occurrence of ] here.
  print substr($0,RSTART+2,RLENGTH-2)   ##printing matched sub string from above regex.
}
'  Input_file                           ##mentioning Input_file name here.
票数 2
EN

Stack Overflow用户

发布于 2022-01-12 10:36:12

使用awk,您可以做到:

代码语言:javascript
复制
awk -v FS=' |[[]|[]]' '/^[#]+/{sub(/:.*$/,"");print "For " $NF} /^\|\[/{print  $2} /^$/ {print ""}' file
For alarm-integrator
CVE-2020-29361
CVE-2021-35515

For br-agent
CVE-2020-29361
CVE-2021-23214

我们将字段分隔符FS配置为|[[]|[]]:space或[字符或]

  • 条件-action用于获取For alarm-integratorFor br-agent

  • second条件-操作,最后添加空行.

更具可读性:

代码语言:javascript
复制
awk -v FS=' |[[]|[]]' '
/^[#]+/{sub(/:.*$/,"");print "For " $NF}
/^\|\[/{print  $2}
/^$/ {print ""}
' file
For alarm-integrator
CVE-2020-29361
CVE-2021-35515

For br-agent
CVE-2020-29361
CVE-2021-23214
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70678669

复制
相关文章

相似问题

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