正则表达式的思维方式



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

Sep 19 14:56:26邮件服务器sendmail[14460]: rulesset =check_relay, arg1=[108.188.182.85], arg2=127.0.0.4, relay=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),但我不知道从哪里开始以及使用哪个命令。Grep吗?Awk吗?削减?

谢谢你的建议

使用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($2,a,"=");split($4,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=为正向后看模式,然后提取除空格以外的字符

如果您希望提取的模式出现在同一行,

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

最新更新