关于过滤更多关键字的bash脚本

关于过滤更多关键字的bash脚本

谢谢你的时间。

我想在bash脚本中过滤多个keyword01(keyword02、keyword03....),如下所示。我怎样才能得到这个?

所有关键字警报发送到同一电子邮件地址即可。

tail -f /var/log/auth.log | while read line do case "$line" in
        *"keyword01"*) echo "$line" | mutt -s "Email notice title" [email protected];
        ;;    esac 
done

答案1

也许像

tail -f /var/log/auth.log |
  awk -v cmd='exec mutt -s "Email notice title" [email protected]' '
    /keyword1|keyword2/ {print | cmd; close(cmd)}'

一般来说,我会避免使用 shell 循环来处理文本,但您也可以这样做:

tail -f /var/log/auth.log |
  while IFS= read -r line; do
    case "$line" in
      (*"keyword1"* | *"keyword2"*) 
        printf '%s\n' "$line" |
          mutt -s "Email notice title" [email protected];;
    esac 
  done

在 中zsh,您也可以使用*("keyword1"|"keyword2")*。在kshbash -O extglob, *@("keyword1"|"keyword2")*.

该问答认为使用循环来处理文本是不好的做法,但这里我们确实需要在这些行上运行命令,这不仅仅是文本处理,而且是运行命令的 shell 作业。

在这里,文件的读取和文本的匹配效率比 with 低awk,但运行mutt效率更高,因为awk调用 shell 来解释要运行的命令行并运行mutt

请注意,这tail -f file是 的缩写tail -n 10 -f file,就像tail file是 的缩写一样tail -n 10 file。也就是说,它打印文件的最后 10 行,然后输入跟随模式,它打印之后添加到文件中的所有内容。

在这里,在我看来,您应该使用tail -n+1 -f file打印整个文件和下列的,或者tail -n0 -f file只打印从现在开始将添加到文件中的内容。

另请参阅-F某些tail实现中检测重命名的选项。/var/log/auth.log通常最终会/var/log/auth.log.1在轮换后重命名为新的/var/log/auth.logtail -f当您想要切换到新文件时,将继续观看相同的文件(现已重命名/var/log/auth.logtail -F

相关内容