如何用尾巴覆盖最后一行?

How to override the last line with tail?

要监控日志文件,我使用以下命令: tail -f -n 1 myfile.log | perl -ne 'print if s/progress (\d+).*/%/g' 这将在我的终端中创建带有数字的行。如何修改此命令以覆盖最后一行?添加 \r3[K 并不能解决问题: tail -f -n 1 myfile.log | perl -ne 'print if s/progress (\d+).*/`\r3[K%/g'

当您在 Perl 中读取一行时,结尾的换行符不会被删除。此外,正则表达式中的 . 不匹配换行符,除非存在 s 修饰符。因此,在您的第二个代码段中,\r 字符始终打印为一行中的第一个字符,因此没有任何效果。

要修复它,可以执行以下操作:

  1. 在正则表达式中添加 s 修饰符以同时删除换行符。
  2. 在打印字符串之前,打印一个 \r 字符以移动到行中的第一个位置。
  3. 由于 STDOUT 是行缓冲的,您需要将其更改为每次打印时自动刷新。这可以通过将 1 分配给 $|.
  4. 来完成

最终代码:

perl -ne '$|=1; print if s/progress (\d+).*/\r%/s'