检查哪个字符串在不断增长的文件中首先出现

检查哪个字符串在不断增长的文件中首先出现

我正在运行一个生成日志文件的远程可执行文件。

我想编写一个脚本来检查可执行文件是否成功运行或遇到错误。我可以这样做的方法是查看不断增长的日志文件并查看字符串"error""success"是否首先出现。

我知道我可以使用以下方法实时 grep 一个文件

tail -f output.log | grep --line-buffered "string"

但是,我可以编写一个脚本来告诉我 grep for"error"还是 grep for"success"先出现吗?

答案1

使用 grep 搜索两个字符串,提取第一个匹配的行号,并比较值。

  • grep 选项-n给出任何匹配的行号。
  • 选项-m1 仅列出第一个匹配然后退出。
  • -F顺便说一下,如果搜索字符串中不需要正则表达式,则选项fast grep - 可能会有用。

错误 grep 的示例输出将类似于 - 从输出中提取行号 235。

235:[Wed Jun 04 12:23:19 2014] [error] child pid 6575 Segmentation fault (11)

可以通过从输出中删除最长的子字符串匹配来提取行号%%:.*,以留在 if 语句中进行比较的数值。

er_match=$(tail -f output.log | grep -n -F -m1 --line-buffered "error")
ok_match=$(tail -f output.log | grep -n -F -m1 --line-buffered "success")

if [[ ${er_match%%:.*} - gt ${ok_match%%:.*} ]];then
    echo "error first"
else
    echo "sucess first"
fi

答案2

您可以通过仅查看 返回的第一个结果来执行此操作grep,例如head -n1

status=$(grep -o 'success\|error' output.log | head -n1)
if [[ $status == "success" ]]; then
    # Program started successfully
else
    # Program encountered an error
fi

答案3

如果你使用egrep您可以检查每一行上的任一字符串:

egrep 'success|failure'

这将按顺序显示各行,您可以将输出通过管道传输到某个对象来选择第一行。

相关内容