bash - 计算和输出命令的行数

问题描述 投票:0回答:4

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

我可以运行该程序两次:

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

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

bash
4个回答
17
投票

使用

tee
流程替换:

program-command | tee >(wc -l)

要保留颜色,请按照

此答案
在命令前添加 script -q /dev/null

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

5
投票

你可以使用 awk:

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

0
投票

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

如果您无权访问内存安装的文件系统,请尝试使用数组来保存结果,以便您可以使用数组大小

echo ${#ArrayName[@]}
然后输出
echo ${arrName[@]}


0
投票

从本上面的回答中获得一些见解后,我可以进行以下工作:

$# > function getOutputAndLineCount {
       function __RESULT { export LINE_COUNT=$(cat -); }
       exec 3>&1
       __RESULT < <( { cat $1 | tee >(wc -l 1>&2); } 2>&1 >&3 3>&-;) 3>&-
       exec 3>&-
       unset -f __RESULT;
     }
$#> getOutputAndLineCount 1.sh
a
b
c
$#> echo $LINE_COUNT
3
© www.soinside.com 2019 - 2024. All rights reserved.