要分析的文本是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?切?
感谢您的建议。
答案 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)
同一行中的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)
希望它有帮助!
答案 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