Find

遞歸查找內容與特定正則表達式匹配的所有文件

  • February 5, 2021

我喜歡搜尋所有 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 命令提示符下直接搜尋會很好。

任何提示將不勝感激。

由於您使用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 = 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[] = ... 等等。

找到字元串(以粗體輸出,由 突出顯示grep),因此您可以將其與-r選項一起使用(因為您似乎正在使用 GNU grep)以遞歸方式查找它。

另外,請記住,-regex選項find不檢查文件內容是否與正則表達式匹配,而是檢查文件名**是否匹配。要使用 對所有文件或文件進行基於正則表達式的搜尋,請使用.php``.txt``find

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 的擴展。速記概念 eg 是對正則表達式的\sPerl 擴展,並且在設計用於處理正則表達式的程序之間不一定可移植。
  • 字元列表(例如[a-z])中範圍規範的含義可能取決於語言環境設置,特別是排序規則[a-z]意思是“天真”的解釋abcdefgh....xyz只在C語言環境中是正確的;在其他情況下,它通常表示aAbBcCdD ... xXyYz,因此需要謹慎使用(有關該主題的進一步討論,請參見此處此處)。如果您使用的程序支持它們,則字元類可能是“更安全”的,但如前所述,不一定是可移植的表達這種規範的方式(例如,您使用POSIX 字元類的意圖[a-zA-Z0-9]將實現[[:alnum:]])。
  • 您已經轉義了幾個在正則表達式(大多數實現)中實際上沒有特殊含義的字元,例如\=and \;。這可能在許多情況下都有效(awk例如 GNU 手冊頁指出

\c 字面意思c

在“字元串常量”部分中),但通常應該避免,因為當嘗試將正則表達式移植到其他程序/環境時,它可能會在那裡獲得特殊含義(在 中vim\= 實際上是則表達式量詞),甚至在同一個程序中在未來的版本中。

引用自:https://unix.stackexchange.com/questions/632185