2015-10-26 35 views
0

要监视日志文件,我使用以下命令: tail -f -n 1 myfile.log | perl -ne 'print if s/progress (\d+).*/$1%/g' 这将在我的终端中创建一个带有数字的行。我如何修改这个命令来覆盖最后一行?添加\r\033[K并没有诀窍: tail -f -n 1 myfile.log | perl -ne 'print if s/progress (\d+).*/`\r\033[K$1%/g' 如何用尾部覆盖最后一行?

+1

什么是 “最后一行” 的意思是,如果你正在运行'尾巴-f'? – Sobrique

+0

我的命令产生这样的输出:56(换行符)57(换行符)58(换行符)59 ...我只想看最后一个数字。在那种情况下59. –

+2

是的。但'tail -f'继续运行,并且不发送'eof' - 所以'perl'不知道它是什么时候是“最后一行”,因为可能会有另一个。 – Sobrique

回答

4

当您在Perl中读取一行时,尾随的换行符不会被去除。此外,除非s修饰符存在,否则正则表达式中的.与新行字符不匹配。因此,在您的第二个片段中,\r字符总是作为第一个字符打印出来,因此不起任何作用。

要修复它,下面可以做:

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

最终代码:

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

不错!谢谢! –