首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式的思维方式

正则表达式的思维方式
EN

Stack Overflow用户
提问于 2016-09-19 13:16:49
回答 2查看 86关注 0票数 0

要分析的文本是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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-19 13:27:17

使用arg1提取cut

代码语言:javascript
复制
$ cut -d',' -f 2 sendmail.log | cut -d'=' -f 2
[108.188.182.85]

使用relay提取cut

代码语言:javascript
复制
$ 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

代码语言:javascript
复制
$ 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)

希望能帮上忙!

票数 0
EN

Stack Overflow用户

发布于 2016-09-19 13:42:34

如果您有greppcre

代码语言:javascript
复制
$ 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=为正向后模式,并提取空间以外的字符。

如果您希望在发生时在同一行中提取模式,

代码语言:javascript
复制
$ perl -nle 'print join " ", /arg1=\[\K[^]]+|relay=\K[^ ]+/g' ip.txt    
108.188.182.85 108-188-182-85.biz.bhn.net
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39574187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档