【问题标题】:What's an alternative to echo grep in parsing a running log?echo grep 在解析运行日志时的替代方法是什么?
【发布时间】:2014-01-22 06:33:06
【问题描述】:

我目前正在考虑使用 bash 脚本(抱歉,不能使用 perl 等其他语言)来跟踪服务器启动期间的运行日志。基本上,我必须根据在写入日志时是否遇到某些字符串或模式来触发某些事件。目前,我有这个代码:

LOG=path_to_logfile
LINE1="[1-9][0-9]* some string"
LINE2="another string"
LINE3="third string"

tail -fn0 $LOG | \
while read line
do
 echo $line | grep "$LINE1" || echo $line | grep "$LINE2" || echo $line | grep "$LINE3"

 if [ $? = 0 ]
 then
      TMP=<echo line above>

      ... bunch of conditional statements...
 fi
done

但是,这有点慢;当 echo/grep 组合使用 or 检测到我需要跟踪的线路时,它是在服务器已经启动之后的 waaaay。什么是上述的好选择?我读过应该使用 awk,但是当我尝试用 awk 编写它时,要么我写错了,要么处理过程也花费了太多时间才能完成。

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 你在跟踪什么?哪个服务器日志?
  • 我正在启动一个 jboss 服务器,假设它有 /path/to/server.log 作为日志文件。抱歉,我在手机中输入此代码时刚刚编辑了代码,因此格式被破坏了。
  • 不幸的是,只要 tail -f 的输出通过管道,流就会被缓冲,管道之后的所有内容都不再反映正在写入的日志的实时时间。

标签: linux bash logging grep echo


【解决方案1】:

我会尝试这样的事情:

tail -fn0 $LOG | egrep "$LINE1|$LINE2|$LINE3" | \
    while read TMP
    do
        ...
    done

这样,while read 循环(猜测将是整个操作中最慢的部分)仅在 egrep 实际在输入日志中找到匹配行时才被调用。

【讨论】:

  • 有道理,会试试这个。我的上述问题是每次我更改 echo/grep 部分时,当我读取变量行时,它没有更新(即进程检测到匹配但正在读取的日志行尚未更新为最新行) .希望这是有道理的。但我会去尝试 egrep。谢谢!
【解决方案2】:

可以有多个匹配语句,将ORed 一起看是否匹配:

tail -f -n0 "$LOG" | grep -e "$LINE1" -e "$LINE2" -e "$LINE3" | while IFS= read -r line
do
    # Do something with each matching $line
done

【讨论】:

    【解决方案3】:

    而不是在每一行调用grep(可能多次),让bash进行正则表达式匹配。

    LOG=path_to_logfile
    LINE1="[1-9][0-9]* some string"
    LINE2="another string"
    LINE3="third string"
    
    tail -fn0 $LOG | while read line
    do
        if [[ $line =~ $LINE1|$LINE2|$LINE3 ]]; then
            TMP=<echo line above>
             ... bunch of conditional statements...
        fi
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-23
      • 1970-01-01
      • 2013-03-13
      • 2022-12-10
      • 2019-05-31
      • 2011-12-27
      • 2011-02-07
      相关资源
      最近更新 更多