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
来实现远程系统日志功能?安装 rsyslog
或 syslog-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 一行的多个正则表达式的主要内容,如果未能解决你的问题,请参考以下文章