我用
tail -f file | grep pattern
持续grep的所有时间。
但是,有没有办法让grep在同一个地方输出它的模式,比如屏幕顶部?这样屏幕不会一直滚动?
我的情况是这样的:tail -f log_file | grep Status -A 2
将显示当前状态以及将其更改为该状态的原因。问题是屏幕滚动,它变得很烦人。我宁愿让输出卡在屏幕的前3行。
谢谢!
答案 0 :(得分:2)
你可以使用watch命令;它将始终执行相同的命令,但屏幕上的位置将保持不变。这个过程可能会占用更多的CPU或内存:
watch "tail file | grep pattern"
默认情况下,watch每2秒执行一次该命令。您可以使用以下方法调整最多0.1秒:
watch -n 0.1
注意强>
正如@etanReisner所指出的:这与tail -f
不完全相同:tail -f
如果在日志文件中添加了某些内容会立即更改,watch命令只会在执行时注意到,即每2(或0.1秒)。
答案 1 :(得分:1)
假设您使用的是兼容vt100的仿真器......
此命令将拖尾文件,将其传送到grep
,一次读取一行,然后在屏幕的顶行反向显示:
TOSL=$(tput sc;tput cup 0 0;tput rev;tput el)
FROMSL=$(tput sgr0; tput rc)
tail -f file | grep --line-buffered pattern | while read line
do
echo -n "$TOSL${line}$FROMSL"
done
它假设您的输出一次显示一行。如果您想要多行,则可以读取多行,但您必须决定如何缓冲输出。您还可以使用csr terminfo命令设置整个单独的滚动区域,而不是只有一行。
这是滚动区域版本,顶部有十行状态区域:
TOSL=$(tput sc; tput csr 0 10; tput cup 10 0;tput rev;tput el)
FROMSL=$(tput sgr0; tput rc;tput csr 10 50;tput rc)
tail -f file | grep --line-buffered pattern | while read line
do
echo -n "$TOSL${line}
$FROMSL"
done
请注意,您的显示器不时会被破坏,因为主shell和后台任务的输出可能会混淆。
答案 2 :(得分:1)
只需用回车符替换换行符。
tail -f file | grep --line-buffered whatever | tr '\012' '\015'
线路缓冲是为了避免跳跃输出;见http://mywiki.wooledge.org/BashFAQ/009
这很快又脏。如评论中所述,这将使该行的先前内容保留在下面,因此较短的行不会完全覆盖较长的行。您可以添加一些控制代码来解决这个问题,但是您也可以使用Curses进行格式化,例如在rghome's answer中。