从命令中获取行数同时仍输出到终端和文件的最佳方法

Best way to get number of lines from command whilst still outputting to both Terminal and to file

我目前正在编写一个简单的 Bash 脚本,它在文件中查找与目标字符串匹配的行,并将其输出到终端显示和文件。目前的命令是:

grep -r -n -F "myname" /Users/tom/Desktop/* | tee /Users/tom/Desktop/out.txt

此代码完全符合我的要求。但是,我还希望有一个功能,当命令完成时,它会回显发现包含指定字符串的结果(行)数。

执行此操作的最佳方法是什么?我明白使用:

grep -r -n -F "myname" /Users/tom/Desktop/* | tee >(wc -l)

将使我能够获得行数,同时仍然使我能够在终端中查看输出,但是,它不允许我将输出保存到文件中。

提前感谢您的帮助。

此致,汤姆

P.S。该脚本处理非常大的文件,因此效率非常重要。

tee 接受多个文件名写入:

grep -r -n -F "myname" /Users/tom/Desktop/* | tee >(wc -l) /Users/tom/Desktop/out.txt

如果你想

  1. 写入文件
  2. 写入终端
  3. 捕获结果行数

您可以使用:

lines=$(grep -rnF "myname" /Users/tom/Desktop/* |
    tee /Users/tom/Desktop/out.txt /dev/stderr |
    wc -l)

一个选项是 运行 wc -l out.txtgrep | tee 命令之后。

但您也可以将 grep | tee 命令的输出通过管道传输到另一个 tee:

grep -r -n -F "myname" /Users/tom/Desktop/* | tee /Users/tom/Desktop/out.txt | tee >(wc -l)

您可以考虑使用 awk,因为您可以同时匹配和计数:

$ awk -v tgt='myname' '[=10=] ~ tgt {cnt++; print} END{print cnt " matches"}' file

如果要将匹配项写入新文件并将匹配项数分配给变量:

cnt=$(awk -v tgt='myname' '[=11=] ~ tgt {cnt++; print>matches} END{print cnt}' file)