2015-10-26 40 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

不錯!謝謝! –