如何通过Grep筛选rsyslog配置中的远程日志条目
完善grep正则匹配rsyslog远程日志配置行
我来帮你把这个正则补全,刚好之前处理过类似的rsyslog远程配置校验需求。你的初始正则只覆盖了配置行的开头部分,我们需要把远程目标(UDP/TCP标识、主机/端口)和可选注释都包含进来。
最终的grep命令(推荐用扩展正则)
用grep -E来写扩展正则会更清晰,不需要太多转义:
grep -E '^([A-Za-z*]+\.[A-Za-z*]+,)*[A-Za-z*]+\.[A-Za-z*]+\s+@{1,2}[A-Za-z0-9.-]+(:[0-9]+)?(\s+#.*)?$' /etc/rsyslog.conf /etc/rsyslog.d/*.conf
正则各部分详解
我们拆分一下这个正则,看看每部分对应什么:
^:匹配行开头,避免匹配行中间的片段([A-Za-z*]+\.[A-Za-z*]+,)*:匹配多个用逗号分隔的设施.级别块(比如auth.*,authpriv.*,这种末尾带逗号的情况也能兼容)[A-Za-z*]+\.[A-Za-z*]+:匹配最后一个设施.级别块(比如auth.*或*.*)\s+:匹配一个或多个空格(rsyslog配置里设施和远程标识之间需要空格分隔)@{1,2}:匹配1个@(UDP)或2个@(TCP)[A-Za-z0-9.-]+:匹配远程日志服务器的主机名或IP地址(支持字母、数字、点、连字符)(:[0-9]+)?:可选的端口部分,匹配:10514这种格式,?表示这部分可以不存在(\s+#.*)?:可选的注释部分,匹配# 单个"@"表示UDP这种格式,.*匹配注释里的任意内容$:匹配行结尾,确保我们匹配的是完整的配置行,而不是行的一部分
测试匹配示例
这个正则可以完美匹配你给出的两个示例:
auth.,authpriv. @loghost.example.com:10514 # 单个"@"表示UDP
. @@loghost.example.com # 两个"@"表示TCP
也能匹配其他常见的远程配置格式:
kern.* @192.168.1.100:514(UDP+IP+端口)local0.* @@logs.internal(TCP+主机名)mail.* @smtp.logserver:10514 # 邮件日志转发(带注释)
如果你想用基本正则(不需要-E参数)
需要把一些特殊字符转义,命令如下:
grep '^\([A-Za-z*]\+\.[A-Za-z*]\+,\)*[A-Za-z*]\+\.[A-Za-z*]\+\s\+@\{1,2\}[A-Za-z0-9.-]\+\(:[0-9]\+\)\?\(\s\+#.*\)\?$' /etc/rsyslog.conf /etc/rsyslog.d/*.conf
另外,建议同时检查/etc/rsyslog.conf和/etc/rsyslog.d/下的所有配置文件,因为很多系统会把自定义配置放在rsyslog.d目录里。
内容的提问来源于stack exchange,提问作者m3741
相关产品推荐
相关产品推荐

