【问题标题】:Continuous grep, output at same spot on console连续 grep,在控制台上的同一位置输出
【发布时间】:2015-05-07 00:15:58
【问题描述】:

我用

tail -f file | grep pattern

一直是连续的 grep。

但是,有没有办法让 grep 在同一位置输出其模式,比如在屏幕顶部?这样屏幕就不会一直滚动?

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

谢谢!

【问题讨论】:

  • 不完全一样,但watch 是一种将输出保持在屏幕顶部的工具。
  • 尝试通过sed 运行它并将\r 附加到每行的末尾。
  • @MarkSetchell 您还需要清除屏幕/线条,否则您将获得标准类型的覆盖工件。但这是一个有趣的想法。
  • @EtanReisner 我会把它留给你开发 - 我现在很忙 :-)
  • 类似tail ...| sed "s/^/$(tput clear)/"

标签: linux bash grep tail


【解决方案1】:

你可以使用 watch 命令;它将始终执行相同的命令,但屏幕上的位置将保持不变。该进程可能会消耗更多的 CPU 或内存:

watch "tail file | grep pattern"

默认情况下,watch 每 2 秒执行一次该命令。您最多可以使用以下方法调整 0.1 秒:

watch -n 0.1

注意 正如@etanReisner 所指出的:这与tail -f 不完全相同:如果将某些内容添加到您的日志文件中,tail -f 将立即更改,watch 命令只会在执行时注意到,即每 2 秒(或 0.1 秒) .

【讨论】:

  • 我认为您需要引用 watch 'tail file | grep pattern' 才能使其正常工作。否则,您将看到可能不是想要的监视输出。
  • 此外,如果日志填充得非常快,这与tail -f 也不完全相同,即使在0.1
  • 感谢两位非常有建设性的 cmets!我知道这不太一样,所以我添加了这个评论。
  • tail -f 之间的另一个区别是它会不断地 grep 文件的最后 10 行。假设它每 2 秒运行一次,它可能会重复。
  • 不会有重复;因为它总是会删除之前的输出
【解决方案2】:

假设您使用的是兼容 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 的输出和后台任务可能会混淆。

【讨论】:

    【解决方案3】:

    只需将换行符替换为回车即可。

    tail -f file | grep --line-buffered whatever | tr '\012' '\015'
    

    行缓冲是为了避免输出跳跃;见http://mywiki.wooledge.org/BashFAQ/009

    这又快又脏。如 cmets 中所述,这会将行的先前内容留在下面,因此较短的行不会完全覆盖较长的行。您可以添加一些控制代码来解决这个问题,但您也可以使用 Curses 进行格式化,例如 rghome's answer

    【讨论】:

      猜你喜欢
      • 2010-10-05
      • 2016-07-01
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      相关资源
      最近更新 更多