2014-10-16 40 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变量。这将使过程更快。