grep 一行的多个正则表达式

Posted

技术标签:

【中文标题】grep 一行的多个正则表达式【英文标题】:grep multiple regex of a line 【发布时间】:2016-11-29 18:03:13 【问题描述】:

我想将来自路由器的传入系统日志记录到文件中。我收到了系统日志

nc -l -u -p 514 > syslog.log

传入的行由几个由空格分隔的字段组成。

以下是来自 syslog 的两个完整示例行:

<4>Nov 29 16:15:29 kernel: [ 3571.330000] DROP IN=vlan2 OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 SRC=1.235.114.117 DST=1.52.79.209 LEN=337 TOS=0x00 PREC=0x00 TTL=115 ID=30831 PROTO=UDP SPT=161 DPT=220 LEN=317
<4>Nov 29 16:15:30 kernel: [ 3572.200000] DROP IN=vlan2 OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 SRC=7.27.203.227 DST=122.2.79.209 LEN=64 TOS=0x00 PREC=0x00 TTL=52 ID=44018 DF PROTO=TCP SPT=5108 DPT=220 SEQ=3468909622 ACK=0 WIND

我只想要我的 logifile 中的 Time、SRC、PROTO、SPT、DPT 字段,所以我想我可以使用这样的东西作为 DST 和 SRC 的测试:

nc -l -u -p 514 | egrep -o 'SRC=[0-9]1,3.[0-9]1,3.[0-9]1,3.[0-9]1,3|DST=[0-9]1,3.[0-9]1,3.[0-9]1,3.[0-9]1,3' > syslog.log

不幸的是,这会将每个字段打印在一个新行中,如下所示:

SRC=1.235.114.117
DST=1.52.79.209
SRC=7.27.203.227
DST=122.2.79.209

然后我想要一个与第一行对应的输出看起来与此类似: 时间,SRC,PROTO,SPT,DPT

Nov 29 16:15:29,7.27.203.227,TCP,5108,220

还有一个问题。有时我会收到不包含“DS”字段的行,例如示例的第二行。因此,使用 awk 分隔符计算字段似乎不起作用,因为它们不一致。

有人知道我该怎么做吗?

【问题讨论】:

我建议从grep切换到sed 您为什么还要使用nc 来实现远程系统日志功能?安装 rsyslogsyslog-ng 或其他选项之一。其中一些甚至具有过滤器/挂钩,您可以放置​​它们来处理您想做的事情...... 我只是快速浏览了一下 syslog-ng,但我找不到任何选项来重新格式化行输出字段。当然,我可以将不同内容的行过滤到不同的目标日志文件,但我看不到如何对行本身的字段重新排序。我是否错过了 syslog-ng 中的某些内容? @PaulG。官方文档here有一整章(11)关于修改消息。此外,消息可以记录到命名管道或作为自定义程序的输入,因此您可以完成几乎任何您需要做的事情。 【参考方案1】:

正如@twalberg 建议的那样,我现在使用 syslog-ng。

这是我的 syslog-ng.conf:

@version: 3.7
@include "scl.conf"
options 
    threaded(yes);
    chain_hostnames(no);
    stats_freq(43200);
    mark_freq(3600);
;
source s_udp  udp(port(514)); ;
parser p_kv kv-parser(prefix(".kv.")); ;
destination d_router_file  file("/var/log/firewall_drops.csv" template("$DATE,$.kv.SRC$.kv.PROTO,$.kv.SPT,$.kv.DPT\n")); ;
log  source(s_udp);parser(p_kv);destination(d_router_file); ;

【讨论】:

以上是关于grep 一行的多个正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

10-正则表达式-grep

关于grep后跟多个正则查询条件的问题

文件内容查找grep正则表达式

正则表达式 三剑客--awk

shell grep命令的多个正则表达式 组合使用。

grep & 正则表达式