正则表达的思维方式

时间:2016-09-19 13:16:50

标签: bash awk grep cut

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

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](可伪造),拒绝= 553 5.3.0 bla bla bla ...

我想提取括号之间的“arg1”( 108.188.182.85 )值和“relay”的值( 108-188-182-85.biz .bhn.net ),但我不知道从哪里开始以及使用哪个命令。 Grep? awk?切?

感谢您的建议。

2 个答案:

答案 0 :(得分:0)

使用arg1提取cut值:

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

使用relay提取cut值:

$ 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)

希望它有帮助!

答案 1 :(得分:0)

如果您grep pcre

$ 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