要分析的文本是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)
两个值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)
希望有帮助!
如果你有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