将连续流分配给变量并处理变量

将连续流分配给变量并处理变量

我正在尝试为我拥有的自定义日志制作一个分析器。

我的日志文件有一个持续时间时间戳(以毫秒为单位),我想从其他文件中过滤掉该日志文件,并通过电子邮件或 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 中,例如bashthen 循环内设置的变量在循环外不可见。它们ksh93将被设置。如果您需要设置此类变量,bash那么您可能需要查看协进程。

相关内容