如何使用 `grep` 在 PHP 文件中搜索字符串?

16 linux grep

我正在一个包含数百个 PHP 文件的站点上搜索类声明。如何使用grep在当前文件夹和子文件夹中执行此操作?

我测试cd了文件夹,然后像

grep -r 'class MyClass' *.php
Run Code Online (Sandbox Code Playgroud)

小智 35

你可以试试

grep -r --include=*.php "search string" /path/to/dir
Run Code Online (Sandbox Code Playgroud)

  • 效果很好。我总是忘记,但幸运的是,总有这个答案再次帮助我。:) (2认同)

Nou*_*him 9

我建议您使用ctags 之类的东西,而不是使用 grep。但是,如果您愿意,可以执行以下操作

 find <top level dir> -name \*.php | xargs grep "class MyClass"
Run Code Online (Sandbox Code Playgroud)

这当然假设您在class和之间只有一个空格,myClass这可能不是真的。不过,更改正则表达式以查找任意数量的空格很容易。


Kal*_*son 5

如果您使用-r,您可能只想递归搜索当前目录

grep -r 'class MyClass' .
Run Code Online (Sandbox Code Playgroud)

请注意上述末尾的句点。

您告诉的grep是您希望它递归搜索每个*.php文件或目录,但您可能没有任何以 .php 扩展名结尾的目录。以上是最简单的搜索方式,但也包括其他类型的文件,当您到处都有 .svn 目录时,这尤其成问题。如果您没有很多其他文件类型,以上通常就足够了并且效果很好。

grep 的大多数化身都没有指定可以搜索的文件扩展名的方法,因此您通常将 find 与它结合使用:

find <startDir> -iname '*.php' -exec grep 'class[ \t]*MyClass' {} \;
Run Code Online (Sandbox Code Playgroud)

-iname告诉某些版本的 grep 您想要进行不区分大小写的文件名搜索,但是 find 的许多非 GNU 变体不支持它,因此您可以改用它-name

-exec上面的选项具有为每个文件调用 grep 的副作用,这是相当昂贵的。

还有其他版本的 grep 支持 a +,它告诉 find 将参数附加在一起以减少可执行文件的调用次数:

find <startDir> -iname '*.php' -exec grep 'class[ \t]*MyClass' {} + \;
Run Code Online (Sandbox Code Playgroud)

一种经常推荐的减少调用的方法是使用 xargs ,它会尽可能少地触发 grep ,但根据需要尽可能多地触发:

find <startDir> -iname \*.php | xargs grep "class[ \t]*MyClass"
Run Code Online (Sandbox Code Playgroud)

xargs足够聪明,可以将 grep 传递到命令行支持的最大参数数量,但上述变体不能很​​好地处理某些字符,如空格。例如,如果'the file.php' 文件名grep 将接收'the' 作为参数和'file.php' 作为参数,因此两者都不会被找到。相反,我们使用:

find <startDir> -iname \*.php -print0 | xargs -0 grep "class[ \t]*MyClass"
Run Code Online (Sandbox Code Playgroud)

print0-0一起工作并使用后跟空字符的参数,以便完全明确地标识该参数。

如果您在class或制表符之后有多个空格,您可能希望通过更改正则表达式来允许更多字符:class[ \t]*MyClass

StackOverflow 上的这篇文章还有其他示例,并演示了如何排除某些目录,例如 .svn 目录。