gpt4 book ai didi

linux - 带否定的多行正则表达式

转载 作者:太空宇宙 更新时间:2023-11-04 09:24:10 24 4
gpt4 key购买 nike

我有一个多行的文件,结构如下:

Text line1: xxxx
Text line2: x
OS: "MacOS"
NotOS: "Linux"
Text line3:
ID: 12345

Text line1: xxxx
Text line2: x
OS: "MacOS|Linux|Red Hat|Windows|Ubuntu|CentOS|Fedora"
NotOS: "HP-UX"
Text line3:
ID: 12345

我希望获得在操作系统字段中具有“CentOS”但在 NotOS 字段中没有“Linux”的所有 ID。我使用了以下在某种程度上对我有效但不完全有效的方法:

grep -n 'OS\:.*[c|C]ent[o|O][s|S][\S+\n\r\s]+VulnID:' filename |\
grep -v '[L|l][I|i][N|n][U|u][X|x]|Amazon|Amazon Linux'

它倾向于返回:

15386:OS:             "Linux|AIX|Solaris|VMware|FreeBSD|IRIX|NetBSD|OpenBSD|BSD|Fedora|Ubuntu|Red.*Hat|CentOS|OpenSuSE|SuSE|MacOS|Oracle Enterprise Linux|HP-UX"
15404:OS: "SuSE|Linux|AIX|BSD|CentOS|Solaris|HP-UX"
15527:NotOS: "(Unknown|CentOS|Red Hat|Ubuntu|Oracle Enterprise Linux|Debian|Fedora|AIX|SuSE|Solaris)"
15537:NotOS: "(Unknown|CentOS|Red Hat|Ubuntu|Oracle Enterprise Linux|Debian|Fedora|AIX|SuSE|Solaris)"
15705:OS: "Solaris|Linux|CentOS"

第一个数字是行号,但它不会返回带有“ID:”的文本

我如何完成这项工作?

最佳答案

保持简单,只需使用 awk:

$ awk -F': ' '{m[$1]=tolower($2)} $1=="ID" && m["OS"]~/centos/ && m["NotOS"]!~/linux/' file
ID: 12345

或者如果您只想要号码:

$ awk -F': ' '{m[$1]=tolower($2)} $1=="ID" && m["OS"]~/centos/ && m["NotOS"]!~/linux/{print $2}' file
12345

上面是在这个文件上运行的:

$ cat file
Text line1: xxxx
Text line2: x
OS: "MacOS"
NotOS: "Linux"
Text line3:
ID: 12345
Text line1: xxxx
Text line2: x
OS: "MacOS|Linux|Red Hat|Windows|Ubuntu|CentOS|Fedora"
NotOS: "HP-UX"
Text line3:
ID: 12345

关于linux - 带否定的多行正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38492386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com