要分析的文本是linux中的邮件日志。这里有一行:
sendmail14460: ruleset=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.0bla.
我想提取括号中的“(108.188.182.85)”值和“中继”(108-188-182-85.biz.bhn.net),的值,但是我不知道从哪里开始使用哪个命令。Grep?Awk?切?
谢谢你的advies。
发布于 2016-09-19 13:27:17
使用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)这两个值都是arg1和relay,在一行中,用分号;分隔,使用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)希望能帮上忙!
发布于 2016-09-19 13:42:34
如果您有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.netarg1=\[\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.nethttps://stackoverflow.com/questions/39574187
复制相似问题