grep 条件仅抓取某些文本

问题描述 投票:0回答:1

所以我试图从 grep 命令获取某些输出

这是我正在尝试的命令

nslookup -type=TXT "_dmarc.$domain" | grep -Eo '\s*reject|\s*quarantine|\s*none|\s*no answer' || echo "no answer"

它对于普通域来说工作得很好。 当 dmarc 记录有此输出时,麻烦就开始了

v=DMARC1; p=reject; sp=none; adkim=s; aspf=s; rua=mailto:[email protected]; ruf=mailto:[email protected]

我对 grep 不太了解,但我厌倦了使用匹配大小写,但现在输出是

root@main-room:~/spfscript/newupdate# nslookup -type=TXT "_dmarc.domain.com" | grep -Eo '\s*reject|\s*quarantine|\s*none|\s*no answer' || echo "no answer"
reject
none
root@main-room:~/spfscript/newupdate# 

因为

p=reject
sp=none
我无法控制 grep 只向我提供“p=”策略

请帮助我

让我知道我还能做些什么。 我尝试添加空间,但我不确定我做得是否正确。

linux automation grep nslookup
1个回答
0
投票

您需要在要查找的单词之前匹配

p=
,并且
p
之前必须有一个空格,这样就不会匹配
sp=

grep -Eo ' p=(reject|quarantine|none|no answer)'

分配变量后,您可以从开头删除

 p=

如果您使用 GNU grep,则可以使用 PCRE。然后

p=
可以是后视,之后您不必删除它,并且您可以使用
\b
来匹配单词边界。

grep -Po '(?<=\bp=)(reject|quarantine|none|no answer)'
© www.soinside.com 2019 - 2024. All rights reserved.