我正在尝试为我拥有的自定义日志制作一个分析器。
我的日志文件有一个持续时间时间戳(以毫秒为单位),我想从其他文件中过滤掉该日志文件,并通过电子邮件或 IM 向我发送超过阈值时间戳的日志。
目前,我将与许多其他命令通过管道传输的命令的输出分配tail -f
给变量,然后尝试处理变量中的值。但我连简单的echo
日志都没有成功。
这是我正在使用的脚本的最简单形式:
log=$(tail -f $logFile | grep ms | rev | cut -c 3- | rev | awk '{ if($NF > $monitorTreshold) { print $0 } }')
for q in log; do
echo "Query : $q"
done
答案1
正如 Kusalananda 提到的,管道永远不会退出,因此$log
永远不会获得价值。
此外,您可能会看到grep
缓冲输出,因为它不会stdout
。
因此,您需要通过将管道直接输入 shell 循环来实时处理数据,类似于:
tail -f $logFile | grep --line-buffered ms | rev | cut -c 3- | rev | awk '{ if($NF > $monitorTreshold) { print $0 } }' | while read q
do
echo "Query : $q"
done
请注意,在 shell 中,例如bash
then 循环内设置的变量在循环外不可见。它们ksh93
将被设置。如果您需要设置此类变量,bash
那么您可能需要查看协进程。