我wc -l
用来计算命令输出中的行数,因为输入是通过管道传递给它的。
commad | wc -l
这工作正常,但如果command
正在做一些繁重的计算,这会很慢。是否有替代方法显示“到目前为止已通过管道传输”的行数?
当我进行某种逐项计算时,这样的事情会特别有用,比如
cat something | xargs -L1 heavy-per-line-computation | wc -l
我可以手动执行此操作的一种方法是将输出通过管道传输到文件 ( command > file
) 并定期cat file | wc -l
对其执行。但是一个命令(它不重定向到文件,以避免浪费 I/O)是我所追求的。
此命令为遇到的每一行打印一个新数字。如果最后一行是完整的,那么最后一个数字将与所说的一致
wc -l
。如果最后一行不完整,那么awk
可以计算它(在我的 Kubuntu GNUawk
中)但wc -l
不会(因为它确实计算换行符);所以可能存在差异。另一个差异是如果输入完全为空:
wc -l
将打印0
,我们awk
将不打印任何内容。要使其打印,请0
使用此变体:或者,也许您希望每个新号码都覆盖控制台同一行中的旧号码。然后这个:
例子:
yes | head -n 76543 | awk '{printf "\r%s",NR} END {print "\r"NR}'
请注意,该命令会消耗其输入(
tee
可能很方便)。出于监控目的,您可能对以下内容感兴趣:其中(默认
OFS
为空格)几乎就像cat -n
(如果您cat
支持-n
)。pv -l
计算行数,它可以在管道内使用。例子:考虑
pv -lb
相当少的输出。这是使用 Ruby 的解决方案。
count_lines
stderr
最多每半秒打印一次 (via ) 到目前为止收到的行数,以及最后的总计数 (viastdout
)。我认为您正在寻找
pv
(管道视图):大多数终端都采用
CR (\r)
“移至第 1 列”。这使您可以继续覆盖以前的输出。dwc
这是一个将从 stdin 读取的脚本(可以是tail -f
来自文件,也可以来自输出进程替换)。脚本中有一个示例测试台。它需要一个
-l
选项。默认是将输入行号打印到终端中的当前行,为六个数字。使用-l
,它还会打印收到的最后一行的前 60 个字符,清除之前的任何文本。当它看到 EOF 时,它会发出换行符,因此提示出现在最后一个输出下方。