如何实时更新`wc -l`?

如何实时更新`wc -l`?

我有一个命令<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 环境可用于持久设置非默认间隔(遵循相同的规则和格式)。

相关内容