如何用尾巴覆盖最后一行?
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
字符始终打印为一行中的第一个字符,因此没有任何效果。
要修复它,可以执行以下操作:
- 在正则表达式中添加
s
修饰符以同时删除换行符。
- 在打印字符串之前,打印一个
\r
字符以移动到行中的第一个位置。
- 由于
STDOUT
是行缓冲的,您需要将其更改为每次打印时自动刷新。这可以通过将 1
分配给 $|
. 来完成
最终代码:
perl -ne '$|=1; print if s/progress (\d+).*/\r%/s'
要监控日志文件,我使用以下命令:
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
字符始终打印为一行中的第一个字符,因此没有任何效果。
要修复它,可以执行以下操作:
- 在正则表达式中添加
s
修饰符以同时删除换行符。 - 在打印字符串之前,打印一个
\r
字符以移动到行中的第一个位置。 - 由于
STDOUT
是行缓冲的,您需要将其更改为每次打印时自动刷新。这可以通过将1
分配给$|
. 来完成
最终代码:
perl -ne '$|=1; print if s/progress (\d+).*/\r%/s'