2014-10-16 56 views
0

我想跟蹤在許多文件上運行的awk命令的進度。目前,我正在用每個打印語句將文件名打印到屏幕上,但我寧願不要淹沒屏幕。我不是每次都打印一條新線,而是希望一遍又一遍寫同一條線。這可能嗎?我可以使用awk覆蓋輸出到屏幕嗎?

+0

如果您提供了更多的上下文,請解釋您正在嘗試執行的操作並顯示腳本,這將會非常有用。可能有其他方法來解決這個問題。 – 2014-10-16 13:33:11

回答

3

您可以使用ANSI Escape sequencesawk。試試這個:

seq 1 100000 | awk '{print $1 "\033[1A"}' 

Esc[ValueA光標向上:
由指定的行數向上移動光標不改變列。如果遊標已經在頂行,ANSI.SYS將忽略這個序列。


爲了解決由Jlliagre提出的問題,你可以這樣做:

seq 100000 -1 1 | awk '{print "\033[2J\033[;H" $1}' 

它清除屏幕,並將光標的位置來定位0,0

+0

好的! (之前提高)。相關閱讀:[清除Ubuntu真正的bash屏幕](http://stackoverflow.com/a/5367075/1983854) – fedorqui 2014-10-16 10:50:42

+0

這種方法有兩個問題。如果要顯示的字符串比終端寬度更寬,則額外的行將保留在屏幕上。如果要顯示的字符串比前一個字符短(例如:time seq 100000 -1 1),則會在其後顯示剩餘字符。 – jlliagre 2014-10-16 10:55:40

+0

@jlliagre查看我更新的帖子。 – Jotne 2014-10-16 11:27:29

2

下面是做到這一點的一種方法:

find/-type f 2>/dev/null | \ 
    awk -v c=${COLUMNS:-80} '{ printf("%-*.*s \r",c-1,c-1,$0);}' 

printf命令將顯示的字符串截斷爲k在一行中輸出,由下一行覆蓋。

如果您知道輸出的最大寬度,則可以使用它來代替COLUMN變量。這將使過程更快。