正则表达式的思路

Way of thinking for regular expression

要分析的文本是 linux 中的邮件日志。这是一行:

9 月 19 日 14:56:26 邮件服务器 sendmail[14460]:规则集=check_relay,arg1=[108.188.182.85],arg2=127.0.0.4,中继=108-188 -182-85.biz.bhn.net [108.188.182.85] (可能是伪造的), reject=553 5.3.0 bla bla bla ...

我想提取括号之间的 "arg1" (108.188.182.85) 值和 "relay" (108-188-182-85.biz.bhn.net), 但我不知道从哪里开始以及使用哪个命令。格雷普?哇?削减 ?

感谢您的建议。

使用cut提取arg1值:

$ cut -d',' -f 2 sendmail.log | cut -d'=' -f 2
[108.188.182.85]

使用cut提取relay值:

$ cut -d',' -f 4 sendmail.log | cut -d'=' -f 2
108-188-182-85.biz.bhn.net [108.188.182.85] (may be forged)

两个值 arg1relay,在同一行中,用分号分隔 ;,使用 awk:

$ awk 'BEGIN {FS=",";OFS=";"}{split(,a,"=");split(,b,"=");print a[2],b[2]}' sendmail.log
[108.188.182.85];108-188-182-85.biz.bhn.net [108.188.182.85] (may be forged)

希望对您有所帮助!

如果您有 greppcre

$ cat ip.txt 
Sep 19 14:56:26 mailserver sendmail[14460]: ruleset=check_relay, arg1=[108.188.182.85], arg2=127.0.0.4, relay=108-188-182-85.biz.bhn.net [108.188.182.85] (may be forged), reject=553 5.3.0 bla bla bla ...

$ grep -oP 'arg1=\[\K[^]]+|relay=\K[^ ]+' ip.txt 
108.188.182.85
108-188-182-85.biz.bhn.net
  • arg1=\[\K[^]]+arg1=[ 定义为正后视模式,然后提取 ]
  • 以外的字符
  • |relay=\K[^ ]+ 备用模式,其中 relay= 是正后视模式,然后提取 space 以外的字符

如果您想在出现的同一行中提取模式,

$ perl -nle 'print join " ", /arg1=\[\K[^]]+|relay=\K[^ ]+/g' ip.txt    
108.188.182.85 108-188-182-85.biz.bhn.net