【问题标题】:bash - count and output lines from commandbash - 计算和输出命令的行数
【发布时间】:2016-08-07 17:05:16
【问题描述】:

我正在编写一个小脚本,它需要运行一个输出多行的程序,然后显示这些行的计数。但是,该程序可能需要几秒钟才能运行,我宁愿不运行两次,一次用于输出,另一次用于计数。

我可以运行程序两次:

#!/bin/bash
count=$(program-command | wc -l)
program-command
printf "$count lines"

有没有办法在只运行一次程序时获取计数和输出?此输出具有格式,因此理想情况下会保留格式(颜色)。

【问题讨论】:

  • 我知道这很幼稚,但是,为什么不保存输出然后数行呢?像program-command > output 然后wc -l output
  • @Pie86 天真的解决方案可以很好!我试图做类似的事情,但我失败了。我会按照你的建议尝试使用>,谢谢。

标签: bash


【解决方案1】:

使用teeprocess substitution

program-command | tee >(wc -l)

要保留颜色,请按照this answer 为命令添加前缀script -q /dev/null

script -q /dev/null program-command | tee >(wc -l)

【讨论】:

  • 谢谢@Ben。看起来这在技术上有效,但失去了颜色格式。有什么想法吗?
【解决方案2】:

你可以使用 awk:

program-command | awk '{print $0; count++} END {print count}'

【讨论】:

  • 这在技术上是可行的,但我丢失了命令的格式。原始输出是彩色的,但这会产生未着色的文本。有什么想法吗?
  • 我猜这与program-command 有关,它仅在输出传递给 tty 时才输出颜色。例如,如果program-commandls,你应该像这样使用它:ls --color=always | awk '{print $0; count++} END {print count}'(这样颜色会被保留)
【解决方案3】:

有很多方法可以做类似的事情。我个人的偏好是使用 /tmp 上的文件,因为我将它安装在内存中。这样你就可以写入文件,然后快速计算行数并输出。

如果您无权访问内存挂载的文件系统,请尝试使用数组来保存结果,以便您可以使用数组大小 echo ${#ArrayName[@]} 然后输出echo ${arrName[@]}

【讨论】:

  • 感谢您的回复。我意识到我的目标之一是保留原始输出的颜色格式。这些解决方案会这样做吗?
猜你喜欢
  • 2021-10-25
  • 1970-01-01
  • 2015-09-18
  • 2015-06-24
  • 1970-01-01
  • 2013-10-21
  • 2014-03-22
  • 1970-01-01
  • 2014-06-13
相关资源
最近更新 更多