![tail、grep 并计算在一个命令中找到的实例?](https://linux22.com/image/663087/tail%E3%80%81grep%20%E5%B9%B6%E8%AE%A1%E7%AE%97%E5%9C%A8%E4%B8%80%E4%B8%AA%E5%91%BD%E4%BB%A4%E4%B8%AD%E6%89%BE%E5%88%B0%E7%9A%84%E5%AE%9E%E4%BE%8B%EF%BC%9F.png)
我正在跟踪文件输出并查找包含特定数据的行。我不想将数据输出到屏幕上,而是计算找到的实例数并将其发送到屏幕上。实例数可以滚动和递增,也可以覆盖现有实例,并且仅在其递增时才显示。那部分并不重要,我只需要找到的实例的运行计数。
我现在的命令是
tail -f 日志文件 | grep'我想要的数据'
我尝试使用 grep -c 和 wc -l,但没有得到我想要的结果。这个特定的 Linux 发行版没有 pv,无法获取它。有什么办法可以做到这一点吗?
答案1
GNU awk 可以相当轻松地做到这一点。
滾動輸出:
tail -f logfile | grep 'stuff to grep for' | awk '{++i;print i}'
您还可以省略 grep 并改用 awk 的正则表达式:
tail -f logfile | awk '/stuff to grep for/ {++i;print i}'
对于单行输出,您可以在前面添加 CR 使其再次从行的最前面开始(在控制台上有效):
tail -f logfile | awk '/stuff to grep for/ {++i;printf "\r%d",i}'
答案2
总是有一个值得信赖的watch
选择:
watch -d grep -c "string" /path/to/file
当您的文件大小超过几百 MB 时,这种方法并不理想。
感谢@sa289 使用中间文件的建议:
tail -f /path/to/file |grep "string" > /tmp/intermediate-file &
watch -d grep -c "string" /tmp/intermediate-file