记录截断文件中出现的次数
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-buffered
和 grep
,以避免 while 循环需要等待输出。
我刚刚意识到的一个问题是:如果 flag 在每一行出现不止一次,$counter
仍然只会增加 1。但是这个问题也在你的解决方案中。
假设我有一个名为 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-buffered
和 grep
,以避免 while 循环需要等待输出。
我刚刚意识到的一个问题是:如果 flag 在每一行出现不止一次,$counter
仍然只会增加 1。但是这个问题也在你的解决方案中。