如何递归搜索目录中的模式并仅打印出文件名和行号

如何递归搜索目录中的模式并仅打印出文件名和行号

目前我使用 grep 如下:

grep -lr <PATTERN> .

这给了我以下输出,其中包含其内容(不是名称)包含的所有文件的列表:

./path/to/file1
./path/to/file2
...

这没关系,但知道行号会很有用。以下输出是理想的,但浏览了 grep 的手册页后,我似乎无法找出正确的开关:

./path/to/file1 15, 22, 54
./path/to/file2 16, 17
...

这可以用 grep 或其他工具实现吗?

答案1

确认默认情况下会执行类似的操作。您可以使用

$ ack blah
path/to/blah
16: blah blah
19: blah blah blah

path/to/more/blah
21: blahness

如果您只想要匹配的文件名,您可以说ack -l.ack -lc将为您提供每个文件的匹配数。

答案2

Grep 可以选择仅打印文件名,或者仅打印文件名和匹配计数,或匹配行(可能包含文件名和行号),但不能将多个匹配压缩在一行上。

您可以过滤 grep 输出,或使用其他工具,例如 awk。

find . -type f -exec awk 'FNR==1 {if (found) print ""; found=0}
                          /PATTERN/ { if (!found) printf("%s", FILENAME);
                                      printf(" %d", FNR);
                                      found=1 }
                          END {if (found) print ""}' {} +

答案3

grep -rins <pattern> *

这符合您的要求吗?

如果您有更复杂的模式,例如使用 时egrep,则使用它可能会很有用egrep -rinos <pattern> *

为了进一步提高可读性,请添加--color到参数列表中。就我个人而言,我的.zshrc

export GREP_OPTIONS="--color"

答案4

grep-H标签包含文件名,grep-n 标签打印行号。如果您只想列出第一个匹配项和文件名,可以使用-l.
要排除其他信息,您可以通过管道传递到,sed同时获取可以通过管道传递到的行号和文件名sed

相关内容