如何实时显示命令输出的行数?


15

我正在使用svn export打包程序脚本作为我的应用程序的一部分,并且与许多其他命令一样,此命令似乎没有任何进度条。

目前,我有两种选择:

  • 在没有选项的情况下使用它,并观看它打印数千行
  • 使用--quiet,直到完成后才开始使用。

有没有办法至少实时显示命令输出的行数?如:

Exporting SVN directory ... 1234 files

1234 实时看到这个数字的增加?我可以想象将输出管道到可以执行此操作的命令,但是哪一个呢?

Answers:


16
yourcommand | { I=0; while read; do printf "$((++I))\r"; done; echo ""; }

或将带括号的部分放在shell脚本中。请注意,这仅在您的shell实际上支持preincrement运算符(例如bash或ksh93或zsh)时才有效。否则,您将不得不增加$I然后打印它(如中所述I=$((I+1));printf...)。另外,如果printf您的shell不是内置的(它是当前bash的内置),则可以使用echo -neprint -n来提高性能。您只想取消换行符,并将\ r解释为转义字符。


哦,我永远都不会让自己学到丑陋的bashscript =和`=`差异和怪癖。:)为什么他们不将其替换为类似python的语法语言...
Boris Burkov

嘿,我知道,什么!您可以将回车符添加到打印的每行中,它不会淹没屏幕,只会覆盖前一行。
鲍里斯·伯科夫

这就是为什么以。printf结尾的原因\r。如果你这样做echo -ne "$I\r"或会发生什么呢print -n "$I\r"?:) printf但是,我使用了它,因为它默认情况下不在末尾打印换行符,因此\r只是移回开头。不幸的是,并非所有的echo实现都支持-eor -n参数。
dannysauer 2013年

1
这也适用于OpenBSD用于/ bin / sh的pdksh版本。
kurtm 2013年

1
+1,尽管绝对正确,但您应该更改readread -r(因为否则行尾的反斜杠会影响计数)。顺便说一句,只需做一些工作,就可以使其显示最新的输出行,这对于某些命令可能很有用。
ruakh

7

这是一个大概的主意,但是您可以使用该pv命令计算行数,并将其显示在屏幕上。 pv在它的许多交换机中,有一个-l交换机在对通过的每一行进行计数。

在这里,我使用while循环来模拟SVN输出中的某些文件。

$ for i in $(seq 100); do echo "file$i"; sleep 2; done | pv -l -c >/dev/null
   3 0:00:05 [0.99/s ] [      <=>             

它将继续覆盖输出行,如下所示:

  18 0:00:36 [   0/s ] [                                     <=>                                                                  ]

  24 0:00:47 [0.991/s ] [                                                <=>                                                      ]

我不知道光伏。万岁学习的东西!
dannysauer 2013年

@dannysauer-值得花一些时间学习pv,它可以测量和显示通过管道的任何物体。
slm

我在阅读评论并一直使用它之后安装了它。使用Linux已有18年了,仍然总是有新的发现。:)
dannysauer

0

您可以在后台将命令作为作业运行,并将其stdout(和stderr(可选))重定向到日志文件:command > logfile &在其中&指定作业(如果也是stderr,请说&>而不是>)。

然后,您可以使用wordcount实用工具使用来计数日志文件中的行数wc -l

为了在一条动态变化的行中显示状态的变化,可以使用,例如while true; do echo -en '\r'; wc -l logfile; sleep 1; done,但是我不能强迫bash绘制\r回车符来杀死前一行的内容。

看到这个问题,它几乎是重复的:https : //stackoverflow.com/questions/2388090/how-to-delete-and-replace-last-line-in-the-terminal-using-bash


1
但是他想要一个不断增加的实时显示,这不是wc所做的。
kurtm 2013年

@kurtm嗯,他想要更多的是不要让printf/print/echodanny提出的结果淹没他的屏幕。:)当然,他可以使用less,但是我想,只要wc -l logfile他不耐烦,他就可以说。我认为,在ncurses这里玩或清除屏幕实在是太过分了。
鲍里斯·伯科夫

嗯,是。他不希望洪水泛滥,但他想知道进度,否则他只能使用--quiet。
kurtm 2013年

@kurtm请参阅更新:您可以帮助调试我的echo -e 'r'命令吗?它应该擦除行的先前打印的内容,以便它可以动态更改,但是我不能强迫它这样做:(
Boris Burkov

您还希望将n选项添加到echo中,以禁止尾随换行符。
kurtm 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.