正则表达式的思路
Way of thinking for regular expression
要分析的文本是 linux 中的邮件日志。这是一行:
9 月 19 日 14:56:26 邮件服务器 sendmail[14460]:规则集=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.0 bla bla bla ...
我想提取括号之间的 "arg1" (108.188.182.85) 值和 "relay" (108-188-182-85.biz.bhn.net), 但我不知道从哪里开始以及使用哪个命令。格雷普?哇?削减 ?
感谢您的建议。
使用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(,a,"=");split(,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=
是正后视模式,然后提取 space 以外的字符
如果您想在出现的同一行中提取模式,
$ perl -nle 'print join " ", /arg1=\[\K[^]]+|relay=\K[^ ]+/g' ip.txt
108.188.182.85 108-188-182-85.biz.bhn.net
要分析的文本是 linux 中的邮件日志。这是一行:
9 月 19 日 14:56:26 邮件服务器 sendmail[14460]:规则集=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.0 bla bla bla ...
我想提取括号之间的 "arg1" (108.188.182.85) 值和 "relay" (108-188-182-85.biz.bhn.net), 但我不知道从哪里开始以及使用哪个命令。格雷普?哇?削减 ?
感谢您的建议。
使用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(,a,"=");split(,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=
是正后视模式,然后提取 space 以外的字符
如果您想在出现的同一行中提取模式,
$ perl -nle 'print join " ", /arg1=\[\K[^]]+|relay=\K[^ ]+/g' ip.txt
108.188.182.85 108-188-182-85.biz.bhn.net