如何显示带有完整路径或文件名的“grep”结果

43

当我使用grep时,如何获取完整的文件路径?

我使用类似以下的命令:

cat *.log | grep somethingtosearch

我需要展示匹配结果的完整文件路径,以显示从哪里提取出该结果。

我该如何做?

9个回答

24

假设您有两个日志文件在:

  • C:/temp/my.log
  • C:/temp/alsoMy.log

进入C:并使用以下命令:

grep -r somethingtosearch temp/*.log

它会给您一个类似以下的列表:

temp/my.log:somethingtosearch
temp/alsoMy.log:somethingtosearch1
temp/alsoMy.log:somethingtosearch2

我该如何获取搜索内容的行号? - Özzesh
@Özzesh 添加 -n 以报告行号。 - Chris Schreiner
但是这个问题标记了Linux和Bash。这似乎是针对Windows的。它在什么环境下运行的? - Peter Mortensen
Ubuntu行数统计(来自man grep)使用:-c, --count 抑制正常输出;而是为每个输入文件打印匹配行的计数。使用-v,--invert-match选项(见下文),计算不匹配的行数。 - undefined

12

我认为真正的解决方案是:

cat *.log | grep -H somethingtosearch

1
如果您将文件内容通过管道传递给 grep 而不是作为参数传递文件名,则 grep 无法知道文件名并打印"(standard input)"。 - EndlosSchleife
5
根据我的理解,这似乎是唯一正确的解决方案。-H 将展示搜索到的文件的路径。太棒了! - activedecay
3
要显示完整路径,必须将完整路径指定为搜索目录,而不是相对路径(在我意识到这一点之前,我遇到了一些麻烦)。 - Poikilos

9

命令:

grep -rl --include="*.js" "searchString" ${PWD}

返回的输出:

/root/test/bas.js

它打印了一个目录两次,一个是绝对路径,另一个是相对路径,我能忽略相对路径吗? - Wasim A.
-rl对我来说已经足够了,谢谢。 - undefined

5

如果您想查看完整路径,我建议您cd到顶级目录(如果使用Windows,则为驱动器的根目录)

cd C:\
grep -r somethingtosearch C:\Users\Ozzesh\temp

或在Linux上:

cd /
grep -r somethingtosearch ~/temp

如果您坚持使用文件名过滤器(*.log),并且需要进行递归操作(文件不都位于同一目录),那么结合使用findgrep是最灵活的方式:

cd /
find ~/temp -iname '*.log' -type f -exec grep somethingtosearch '{}' \;

4

1
它打印了一个目录两次,一个是绝对路径,另一个是相对路径,我能忽略相对路径吗? - Wasim A.
1
@WasimA。它只打印绝对路径,而不是相对路径在我的bash上。你有不同的环境吗?我正在使用Ubuntu 16.04 LTS。 - w..k

1

对我来说

grep -b "searchsomething" *.log

按照我的要求工作了


6
关键是OP想要什么,而不是你想要什么。 - a20
2
@a20:但这确实是楼主(自问自答)。 - Peter Mortensen
1
经典注释 :-) - Anne van Rossum

1

当在所有目录中搜索文件时,此方法有效。

sudo ls -R | grep -i something_bla_bla

输出显示包含“something_bla_bla”的所有文件和目录。只显示路径,不显示文件。
然后使用想要查找的文件在locate命令。

关于解析 ls 的输出,有什么可以说的吗? - Peter Mortensen

0

输出完整路径最简单的方法是将相对起始路径替换为绝对路径:

grep -r --include="*.sh" "pattern" ${PWD}

1
它打印了一个目录两次,一个是绝对路径,另一个是相对路径,我能忽略相对路径吗? - Wasim A.

-3

使用:

grep somethingtosearch *.log

文件名将与匹配项一起打印出来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接