我有一个命令<streaming ls> | wc -l
,它工作正常,但<streaming ls>
需要一段时间,这意味着直到几分钟后我才能得到最终的行数。
wc -l
有没有办法可以实时得到 update 的输出?
答案1
您不能用于wc -l
此目的,但您可以生成使用其他工具(例如 AWK)看到的行的运行计数:
<streaming ls> | awk '{ printf "%d\r", NR } END { print NR }'
这将更新每次看到一行时看到的行数,并在进程结束时以总行数结束。
对于产生大量输出的命令,可以通过打印每个命令来减少开销n线路:
… | awk 'NR % 10 == 0 { printf "%d\r", NR } END { print NR }'
(为了n= 10) 或每秒打印一次:
… | awk 'systime() > lasttime { lasttime = systime(); printf "%d\r", NR } END { print NR }'
(或每个n将条件更改为>= lasttime + n
) 秒。
答案2
您可以用来pv
给您一些进度报告:
cmd | pv -lbtr | wc -l
-l
基于行(报告行数而不是字节数)。-b
报告字节数(这里有行,因为-l
)-t
报告所花费的时间-r
报告当前速率(每秒行数;另请参阅-a
平均速率)。
请注意,文件名可以由多行组成,因此wc -l
的输出ls
不能保证为您提供文件计数,除非您使用-b
或等选项-q
将文件名中的换行符转义为\n
或?
。
答案3
好吧,我曾经使用类似的东西watch -n 1 your command
,不确定这对你的情况是否有任何用处,我不是大师,只是我想到的第一件事。
https://man7.org/linux/man-pages/man1/watch.1.html
watch - 定期执行程序,全屏显示输出
-n, --interval 秒 指定更新间隔。该命令不允许小于 0.1 秒的时间间隔,在此时间间隔内转换较小的值。两个都 '。'和 ',' 适用于任何语言环境。 WATCH_INTERVAL 环境可用于持久设置非默认间隔(遵循相同的规则和格式)。