连续grep,在控制台上的相同位置输出

时间:2015-03-05 15:05:06

标签: linux bash grep tail

我用

tail -f file | grep pattern

持续grep的所有时间。

但是,有没有办法让grep在同一个地方输出它的模式,比如屏幕顶部?这样屏幕不会一直滚动?

我的情况是这样的:tail -f log_file | grep Status -A 2将显示当前状态以及将其更改为该状态的原因。问题是屏幕滚动,它变得很烦人。我宁愿让输出卡在屏幕的前3行。

谢谢!

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中。