我正在编写一个小脚本,需要运行一个输出多行的程序,然后显示这些行的计数。然而,该程序可能需要几秒钟的时间来运行,我不想运行它两次,一次用于输出,另一次用于计数。
我可以运行该程序两次:
#!/bin/bash
count=$(program-command | wc -l)
program-command
printf "$count lines"
有没有办法在只运行一次程序的情况下获得计数和输出?此输出具有格式,因此理想情况下会保留格式(颜色)。
你可以使用 awk:
program-command | awk '{print $0; count++} END {print count}'
有很多方法可以做到这一点。我个人偏好是使用 /tmp 上的文件,因为我将其安装在内存中。这样你就可以写入文件,然后计算行数并很快输出。
如果您无权访问内存安装的文件系统,请尝试使用数组来保存结果,以便您可以使用数组大小
echo ${#ArrayName[@]}
然后输出echo ${arrName[@]}
。
从本上面的回答中获得一些见解后,我可以进行以下工作:
$# > 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