谢谢你的时间。
我想在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")*
。在ksh
或bash -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.log
。tail -f
当您想要切换到新文件时,将继续观看相同的文件(现已重命名/var/log/auth.log
)tail -F
。