从命令中获取行数同时仍输出到终端和文件的最佳方法
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
如果你想
- 写入文件
- 写入终端
- 捕获结果行数
您可以使用:
lines=$(grep -rnF "myname" /Users/tom/Desktop/* |
tee /Users/tom/Desktop/out.txt /dev/stderr |
wc -l)
一个选项是 运行 wc -l out.txt
在 grep | 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)
我目前正在编写一个简单的 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
如果你想
- 写入文件
- 写入终端
- 捕获结果行数
您可以使用:
lines=$(grep -rnF "myname" /Users/tom/Desktop/* |
tee /Users/tom/Desktop/out.txt /dev/stderr |
wc -l)
一个选项是 运行 wc -l out.txt
在 grep | 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)