遞歸查找內容與特定正則表達式匹配的所有文件
我喜歡搜尋所有 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.
您可能已經意識到,這是一個惡意軟體程式碼。所以這個字元串是相似的,但在每個文件上都不同。但是,如果正則表達式程式碼在文件中的某處包含相似的內容,則它可以很好地查找所有文件。
之前,我已經將所有文件下載到我的 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
選項一起使用(因為您似乎正在使用 GNUgrep
)以遞歸方式查找它。另外,請記住,
-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 是對正則表達式的
\s
Perl 擴展,並且在設計用於處理正則表達式的程序之間不一定可移植。- 字元列表(例如
[a-z]
)中範圍規範的含義可能取決於語言環境設置,特別是排序規則。[a-z]
意思是“天真”的解釋abcdefgh....xyz
只在C
語言環境中是正確的;在其他情況下,它通常表示aAbBcCdD ... xXyYz
,因此需要謹慎使用(有關該主題的進一步討論,請參見此處和此處)。如果您使用的程序支持它們,則字元類可能是“更安全”的,但如前所述,不一定是可移植的表達這種規範的方式(例如,您使用POSIX 字元類的意圖[a-zA-Z0-9]
將實現[[:alnum:]]
)。- 您已經轉義了幾個在正則表達式(大多數實現)中實際上沒有特殊含義的字元,例如
\=
and\;
。這可能在許多情況下都有效(awk
例如 GNU 手冊頁指出
\c
字面意思c
在“字元串常量”部分中),但通常應該避免,因為當嘗試將正則表達式移植到其他程序/環境時,它可能會在那裡獲得特殊含義(在 中
vim
,\=
實際上是正則表達式量詞),甚至在同一個程序中在未來的版本中。