远程日志记录条目的 Grep 系统日志配置

Grep syslog configuration for remote logging entries

我想 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 /]#

但是我觉得我可能一次就搞定,我就是技术不够。

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

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

参见regex demo

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

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

参见 this regex demo

图案详情

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

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