记录截断文件中出现的次数

Keep count of occurrences in a truncating file

假设我有一个名为 data.log.

的文件

数据不断地附加到它上面,它可以包含“标志”,它会被外部脚本截断:

[13/Jan/2015:11:11:53 +0000] curabitur flag lacinia nibh in feugiat mollis

tail: data.log: file truncated

[13/Jan/2015:11:11:53 +0000] dapibus enim sagittis efficitur

[13/Jan/2015:11:11:54 +0000] iaculis non flag ac urna.

声明 counter=0 后,我想用找到的次数增加它。我想到了这样的东西,它使用 wc -l 来计算 data.log 中包含 'flag' 的行数:

counter=$(($counter+$(cat data.log | grep s | wc -l)))
echo $counter

现在只剩下一个问题:截断。我将如何处理这个?我想做一个 watch,但我如何接收截断事件?还是我应该完全朝着另一个方向前进?

这应该适合你:

$ tail -F data.log | grep --line-buffered s | while read match ; do ((counter++)) ; done

tail-F 标志与 --follow --retry 相同。 --retry 是这里的神奇之处:

   --retry
          keep trying to open a file even when it is or becomes inaccessi‐
          ble; useful when following by name, i.e., with --follow=name

我还使用了 --line-bufferedgrep,以避免 while 循环需要等待输出。

我刚刚意识到的一个问题是:如果 flag 在每一行出现不止一次,$counter 仍然只会增加 1。但是这个问题也在你的解决方案中。