内容が特定の正規表現に一致するすべてのファイルを繰り返し検索します。

内容が特定の正規表現に一致するすべてのファイルを繰り返し検索します。

私はすべての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にダウンロードし、EEMeditorを使用して正規表現で検索しました。これは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そのオプションを覚えておいてくださいfindいいえファイルが存在することを確認コンテンツ正規表現と一致しますが、ファイルの場合名前マッチ。.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 の拡張です。たとえば、略称の概念は\s正規表現に対するPerl拡張であり、正規表現を処理するように設計されたプログラム間で必ずしも移植可能ではありません。

  • 文字リスト(例:)の範囲指定の意味は、[a-z]特にロケールによって異なります。順序の並べ替え。 「素朴な」解釈は地域的にのみ[a-z]正確です。他の文脈では一般的に意味するので注意して使用する必要があります(参照)。abcdefgh....xyzCaAbBcCdD ... xXyYzここそしてこここのトピックについてさらに議論するため)。使用しているプログラムがそれをサポートしている場合、文字クラスは「より安全」になる可能性がありますが、上記のようにこの仕様が表現される方法では必ずしも移植可能ではありません(たとえば、使用意図は[a-zA-Z0-9]POSIX文字クラスを介して達成されます[[:alnum:]])。 。

  • \=と同様に、正規表現(ほとんどの実装)で実際に特別な意味のない複数の文字をエスケープしました\;。これは多くの場合に機能します(awkたとえば、GNUのマニュアルページに記載されています)。

    \c リテラル文字c

    「文字列定数」を参照)。ただしvim、正規表現の他のプログラム/環境(例:\= 実際には正規表現数量子)、同じプログラムの将来のバージョンでも同様です。

おすすめ記事