我想/var/log/syslog
持续监控我的数据。然而,在监控时,我想避免某些模式。我只对最后 15 行(例如)感兴趣。
对于常规监控我使用以下命令:
watch -n 1 tail -n 15 /var/log/syslog
然而,我真正想要的是:
watch -n 1 tail -n 15 /var/log/syslog | grep -v -E 'pattern1|pattern2'
更具体地说明我的要求:
我想持续监控 中的条目syslog
,避免某些模式。屏幕应该每隔固定时间(例如 1 秒或 2 秒)刷新一次。
以下是更多(失败的)尝试:
watch cat /var/log/syslog | grep -v -E 'pattern1|pattern2'
一次(部分)成功的尝试:
while true;
do
clear;
cat /var/log/syslog | grep -v -E 'pattern1|pattern2' | tail -15;
sleep 1;
echo '\"CTRL-C\" to close';
done
但是,那平滑度在watch
这里丢失了。
概括
那么问题是,有没有办法将 和watch
结合tail
起来grep
?
bash 4.4.7
我在 17.04 上使用。
答案1
你的问题是watch -n 1 tail -n 15 /var/log/syslog | grep -v -E 'pattern1|pattern2'
,我思考,它tail -n 15 /var/log/syslog
在 内部运行watch
,然后将结果通过管道传输到grep
。这几乎肯定会导致中间输出被缓冲,以至于您看不到所期望的内容(至少在您期望的时候看不到)。
可能有一种方法可以通过巧妙使用stdbuf
和/或--line-buffered
grep 选项来实现您想要的效果,但是更简单的方法是在里面运行整个管道watch
:
watch -n 1 'tail -n 15 /var/log/syslog | grep -v -E "pattern1|pattern2"'