查找并grep并打印文件名和行号

时间:2015-06-01 15:27:45

标签: shell unix solaris

我要求打印包含文本的所有文件名和行号。

find . -name '*.cpp' -exec grep -n 'HELLO' {} \; > output.txt

但它只打印内容和行号而不是文件名。怎么实现呢?我是在Solaris上做的。

6 个答案:

答案 0 :(得分:4)

这是一个使用awk而不是grep的选项:

find . -name '*.cpp' -exec awk '/HELLO/ { print FILENAME, NR }' {} + > output.txt

每当模式匹配时,都会打印文件名和行号。我使用了-exec {} +,因此多个文件名作为参数传递给awk的单个调用,如果要搜索大量文件,这个文件名应该更快。

答案 1 :(得分:1)

如果你的grep不支持-H选项(Solaris 10上的greps没有),典型的解决方法是将文件/dev/null添加到grep的命令行。该文件不匹配任何内容,但由于命令行中有两个或更多文件,grep将在其输出中显示文件名。

find . -name '*.cpp' -exec grep -n 'HELLO' /dev/null {} \; > output.txt

答案 2 :(得分:0)

你还需要一个grep参数:

  -H, --with-filename
          Print the filename for each match.

我没有看到从grep中的输出中排除匹配文本的方法。您可能需要再次过滤输出。

答案 3 :(得分:0)

为什么不使用" -r"选项" grep"它在文件中查找:

find . -name '*.cpp' | grep -n -r HELLO > output.txt

答案 4 :(得分:0)

你可以尝试

grep -n 'HELLO' `find . -name '*.cpp'` > output.txt

我无法在solaris上测试它,所以我不确定它是否会起作用。

答案 5 :(得分:0)

让grep查看2个文件。我通常使用/ etc / passwd,但/ dev / null更好:

find . -name '*.cpp' -exec grep -n 'HELLO' {} /dev/null \; > output.txt