首页 > 解决方案 > 用于远程日志记录条目的 Grep syslog 配置

问题描述

我想 grep 我的 rsyslog 配置文件以检查是否配置了远程日志记录条目。

我希望 grep 带来的行如下:

auth.*,authpriv.*               @loghost.example.com:10514 # One "@" means UDP
*.*                             @@loghost.example.com      # Two "@" means TCP

到目前为止,我已经设法生成了以下正则表达式,它只给我带来了以一组字母或星号开头的行,后面跟着一个点,然后是另一组字符或星号:

grep "^[A-Za-z|*]*\.[A-Za-z|*]" /etc/rsyslog.conf

如何让 grep 正确识别该行的其余部分?由于该行之后可以跟一个逗号,更多的东西,一个空格序列和一个“@”符号,或者它后面可以跟一个空格序列和一个“@”符号。

编辑:到目前为止,我目前的正则表达式能得到什么:

[root@RHEL7lab /]# grep "^[A-Za-z|*]*\.[A-Za-z|*]" /etc/rsyslog.conf
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
cron.*                                                  /var/log/cron
*.emerg                                                 :omusrmsg:*
auth.*,authpriv.*               @loghost.example.com:10514 # One "@" means UDP
*.*                             @@loghost.example.com      # Two "@" means TCP
[root@RHEL7lab /]#

我想要一个只会产生上面显示的最后两行的正则表达式。

我已经成功地将它传递给另一个 grep,如下所示:

[root@RHEL7lab /]# grep "^[A-Za-z|*]*\.[A-Za-z|*]" /etc/rsyslog.conf | grep "\s@"
auth.*,authpriv.*               @loghost.example.com:10514 # One "@" means UDP
*.*                             @@loghost.example.com      # Two "@" means TCP
[root@RHEL7lab /]#

但我认为我可能只用一次就可以做到,我只是缺乏技能。

标签: regexlinuxgrepsyslog

解决方案


*您可以匹配以字母数字或字符开头的行.,然后可以有 0+ 字符而不是空格,然后@在任何 1+ 空格字符之后:

grep -E '^[[:alnum:]*.]+[^[:space:]]*[[:space:]]+@' file

请参阅正则表达式演示

更具体的正则表达式看起来像

grep -E '^([[:alnum:]]+|\*)\.([[:alnum:]]+|\*)[^[:space:]]*[[:space:]]+@' file

请参阅此正则表达式演示

图案细节

  • ^- 字符串的开始
  • [[:alnum:]*.]+- 1 个或多个字母数字字符,*.
  • ([[:alnum:]]+|\*)- 1+ 字母数字字符或*符号
  • \.- 一个点
  • ([[:alnum:]]+|\*)- 1+ 字母数字字符或*符号
  • [^[:space:]]*- 除空白字符外的 0+ 个字符
  • [[:space:]]+- 1+ 空白字符
  • @- 一个@字符。

请注意,该-E选项允许使用 POSIX ERE 语法(无需转义+,例如)。


推荐阅读