Bash 文件和行数匹配

Bash 文件和行数匹配,bash,shell,Bash,Shell,我试图计算文件中与给定模式匹配的行数。现在的问题是它只给了我行数。如何获取文件位置或名称以及匹配行数 我现在使用的命令是 for i in $(find . -name 'foo.txt' | sed 's/\.\///g'); do grep -l && -c '^>' $i; done 因此,我期望的输出类似于“文件位置/名称匹配行数”grep可以显示文件名,如果您将其指定为命令行参数。您可以使用xargs为每批文件名调用grep。它将从标准输入中读取名称,并

我试图计算文件中与给定模式匹配的行数。现在的问题是它只给了我行数。如何获取文件位置或名称以及匹配行数

我现在使用的命令是

for i in $(find . -name 'foo.txt' | sed 's/\.\///g');
do
    grep -l && -c '^>' $i;
done

因此,我期望的输出类似于“文件位置/名称匹配行数”

grep
可以显示文件名,如果您将其指定为命令行参数。您可以使用
xargs
为每批文件名调用grep。它将从标准输入中读取名称,并将它们用作grep的命令行参数

find . | xargs grep -cH '^>'
使用
find
命令:

find . -name 'foo.txt' | sed 's/\.\///g' | xargs grep -cH '^>'

捕获变量中匹配的行数并对其进行测试:

n=$(grep -c '^>' "$i")
(( n > 0 )) && echo "$i:$n"
实际上,您甚至不需要测试:如果没有找到匹配项,grep将失败退出,因此

n=$(grep -c '^>' "$i") && echo "$i:$n"

事实上,那工作太多了。至少对于GNU grep,使用
-H
选项。一个我随身携带的文件演示:

$ grep -c zero note.xml
16
$ grep -Hc zero note.xml
note.xml:16

欢迎光临
grep-l&&-c'^>'$i
看起来不是有效的命令。介意提供一些示例输入和所需输出吗?。添加
-H
grep选项(如果xargs只剩下一个文件),这是最好的答案,或者等效地提供
/dev/null
作为文件名参数,以便始终有多个文件;但是明确指定
-H
肯定更优雅。非常感谢Rob DavisThanks的建议非常感谢glenn jackman。。对我来说,它只需稍加修改即可生效:)