递归查找内容与特定正则表达式匹配的所有文件

递归查找内容与特定正则表达式匹配的所有文件

我喜欢搜索所有 PHP 文件并找到由正则表达式标识的特定字符串。

我用来查找字符串的正则表达式是:

\$[a-zA-Z0-9]{5,8}\s\=\s.{30,50}\;\$[a-zA-Z0-9]{5,8}\s\=\s[a-zA-Z0-9]{5}\(\)

我尝试使用:

grep -r "\$[a-zA-Z0-9]{5,8}\s\=\s.{30,50}\;\$[a-zA-Z0-9]{5,8}\s\=\s[a-zA-Z0-9]{5}\(\)" *.php

但这似乎不起作用。

find . -name '*.php' -regex '\$[a-zA-Z0-9]{5,8}\s\=\s.{30,50}\;\$[a-zA-Z0-9]{5,8}\s\=\s[a-zA-Z0-9]{5}\(\)' -print

也不行。

我需要搜索包含由上述正则表达式标识的字符串的 PHP 文件的路径和所有子目录。实现这一目标的最佳方法是什么?

供您参考,这是一个类似于我尝试找到的字符串:

<?php
$tqpbiu = '9l416rsvkt7c#*3fob\'2Heid0ypax_8u-mg5n';$wizqxqk = Array();$wizqxqk[] = $tqpbiu[11].$tqpbiu[5].$tqpbiu[21].$tqpbiu[27].$tqpbiu[9].$tqpbiu[21].$tqpbiu[29].$tqpbiu[15].$tqpbiu[31].$tqpbiu[36].$tqpbiu[11].$tqpbiu[9].$tqpbiu[22].$tqpbiu[16].$tqpbiu[36];$wizqxqk[] = ... etc.

regexr com 正则表达式的屏幕及其发现的内容

您可能已经意识到,这是恶意软件代码。所以这个字符串在每个文件上是相似但不同的。但是,如果文件中某处包含类似内容,则正则表达式代码可以很好地查找所有文件。

之前,我将所有文件下载到我的Windows PC上,然后使用EMEditor通过正则表达式进行搜索。这在 PC 上工作得很好,但为此我需要下载所有内容,如果能够直接在 Linux 命令提示符下搜索,那就太好了。

任何提示将非常感激。

答案1

由于您grep使用正则表达式进行搜索,因此您必须注意grep默认情况下将搜索字符串解释为基本正则表达式 (BRE)。您使用的语法包含扩展正则表达式 (ERE) 语法,因此您需要使用该-E标志。

将您发布的字符串示例复制到文件中test.php,调用

~$ grep -E '\$[a-zA-Z0-9]{5,8}\s=\s.{30,50}\;\$[a-zA-Z0-9]{5,8 }\s=\s[a-zA-Z0-9]{5}\(\)' *.php

$tqpbiu = '9l416rsvkt7c#*3fob\'2Heid0ypax_8u-mg5n';$wizqxqk = 数组();$wizqxqk[] = $tqpbiu[11].$tqpbiu[5].$tqpbiu[21].$tqpbiu[27].$tqpbiu[9].$tqpbiu[21].$tqpbiu[29].$tqpbiu [15].$tqpbiu[31].$tqpbiu[36].$tqpbiu[11].$tqpbiu[9].$tqpbiu[22].$tqpbiu[16].$tqpbiu[36];$wizqxqk[] =...等等

找到字符串(以粗体输出,如 突出显示grep),因此您可以将其与-r选项一起使用(因为您似乎正在使用 GNU grep)来递归查找它。

另外,请记住,-regex选项finddos不是检查文件是否内容匹配正则表达式,但如果文件的姓名火柴。要使用进行基于正.php则表达式的搜索,请使用.txtfind

find . -type f \( -name '*.php' -o -name '*.txt' \) -exec grep -EH '\$[a-zA-Z0-9]{5,8}\s=\s.{30,50}\;\$[a-zA-Z0-9]{5,8}\s=\s[a-zA-Z0-9]{5}\(\)' {} \;

其中-H选项grep也将确保文件名被打印。或者,使用grep -El etc.仅有的打印文件名(如果许多文件匹配,这将使输出更清晰)。

一些一般性评论

正如 Stéphane Chazelas 正确指出的那样,并作为未来读者的参考:语法的几个元素是正则表达式语法的不可移植扩展,并且其他构造的行为可能会根据环境设置而有所不同:

  • 字符类(不要与字符列表)是标准 ERE 的扩展。简写概念\seg 是正则表达式的Perl 扩展,并且不一定可以跨设计用于处理正则表达式的程序移植。

  • 字符列表中范围规范的含义(例如[a-z])可能取决于区域设置,特别是整理顺序。 “天真的”解释[a-z]abcdefgh....xyz在当地才是正确的C;在其他情况下,它通常意味着aAbBcCdD ... xXyYz,因此需要小心使用(请参阅这里这里以便进一步讨论该主题)。如果您使用的程序支持它们,字符类可能是一种“更安全”,但如上所述,不一定是可移植的,表达这种规范的方式(您使用的意图[a-zA-Z0-9]将通过 POSIX 字符类来实现[[:alnum:]],例如)。

  • 您已经转义了几个在正则表达式(大多数实现)中实际上没有特殊含义的字符,例如\=\;。这在许多情况下可能有效(GNUawk手册页例如指出

    \c 文字字符c

    在“字符串常量”部分中),但通常应该避免,因为当尝试将正则表达式移植到其他程序/环境时,它可能会在那里获得特殊的含义(在vim\= 实际上是A正则表达式量词),甚至在未来版本的同一程序中。

相关内容