`grep`を使用してPHPファイル内の文字列を検索するにはどうすればよいですか?


11

何百ものPHPファイルがあるサイトでクラス宣言を探しています。grepを使用して現在のフォルダーとサブフォルダーでこれを行うにはどうすればよいですか?

cdフォルダーにing をテストしてから

grep -r 'class MyClass' *.php

これがスーパーユーザーに移行するとき、あなたがgrep -r与えたくないものについて何か言いたいかもしれません。

私は混乱しています-あなたは自分自身に答えなかったのですか?その行の結果は何でしたか?さらに最適化しようとしていますか?この質問を他の誰かとして読むことを想像してください。それは混乱を招き、不明瞭です。
メダーオムラリエフ

@otherコメント:すべてのフォルダは、おそらくそうではありません.PHPで終わるしない限り、彼はgrep -r文が...、彼が望んでいるものを与えていません
デビッド・オニール

何も得られませんでした。私はそれを見つけた知っているので、それが機能しなかったと仮定したときにイムこのクラスでファイルのあるフォルダに

幸運にもファイルを見つけました。その行のPHPファイルがあるフォルダーでファイルを検索すると、そのファイルが見つかります(-rは必要ありません)。ルートにCDを移動し、再帰-rで検索すると、何も返されません。

回答:


24

あなたが試すことができます

grep -r --include=*.php "search string" /path/to/dir

1
よく働く。私は忘れてしまいますが、幸いにも私を助けるためにこの答えがいつもあります。:)
GolezTrol 14年

@GolezTrolそれを知ってうれしい:-)
rahul286

9

grepではなくctagsのようなものを使用することをお勧めします。ただし、必要に応じて、次のようなことができます

 find <top level dir> -name \*.php | xargs grep "class MyClass"

もちろんこれは、あなたが間に1つだけのスペースがあることを前提とclassし、myClass真実ではないかもしれないが。ただし、正規表現を変更して任意の数の空白を探すのは簡単です。


4

を使用する場合-r、おそらく現在のディレクトリだけを再帰的に検索する必要があります。

grep -r 'class MyClass' .

上記の最後の期間に注意してください。

あなたが言っgrepたことは、すべての*.phpファイルまたはディレクトリを再帰的に検索したいが、おそらく.php拡張子で終わるディレクトリを持っていなかったということです。上記は検索を行うための最も簡単な方法ですが、他の種類のファイルも含まれています。これは、どこにでも.svnディレクトリがある場合に特に問題となります。他のファイルタイプがあまりない場合は、一般に上記で十分であり、うまく機能します。

ほとんどのgrepの化身には、検索可能なファイル拡張子を指定する方法がないため、通常はfindと組み合わせて使用​​します。

find <startDir> -iname '*.php' -exec grep 'class[ \t]*MyClass' {} \;

-inamegrepの一部のバージョンに、大文字と小文字を区別しないファイル名検索を実行するように指示しますが、findの非GNUバリアントの多くはサポートしていないため、-name代わりに使用できます。

上記の-execオプションには、すべてのファイルに対してgrepを呼び出すという副作用があり、かなりコストがかかります。

grepのさらに他のバージョンは、findに+引数を一緒に追加して実行可能ファイルの呼び出し回数を減らすよう指示するa をサポートしています。

find <startDir> -iname '*.php' -exec grep 'class[ \t]*MyClass' {} + \;

呼び出しを減らすために頻繁に推奨される方法は、xrepを使用することです。これは、grepを可能な限り数回、ただし必要な回数だけ起動します。

find <startDir> -iname \*.php | xargs grep "class[ \t]*MyClass"

xargsコマンドラインでサポートされる引数の最大数までgrepを渡すのに十分賢いですが、上記のバリエーションはスペースのような特定の文字をうまく処理しません。たとえば、ファイル名grepが引数として「the」を受け取り、引数として「file.php」を受け取る場合、「the file.php」の場合、両方は見つかりません。代わりに使用します:

find <startDir> -iname \*.php -print0 | xargs -0 grep "class[ \t]*MyClass"

print0そして、-0一緒に作業し、使用の引数は、引数が完全かつ明確に識別されるようにヌル文字が続きます。

class、またはタブの後に複数のスペースがある場合、正規表現を変更してより多くの文字を許可することができます。class[ \t]*MyClass

StackOverflowのこの投稿には他の例があり、.svnディレクトリなどの特定のディレクトリを除外する方法を示しています。


これにより、すべてのファイルが検索されます。また、.phpファイルではないファイル。
GolezTrol

他の多くの例を含むように投稿を更新しました。
カレブペダーソン

3

これまでにない素晴らしいackを使用して、

ack --php 'class MyClass'

1
grep -r 'class MyClass' *.php

.phpで終わる名前を持つすべてのフォルダーを検索します

grep -r 'class MyClass' . | grep .php

すべてのサブフォルダー内のすべてのファイルでクラスMyClassを検索し、.phpが含まれているファイルのみを返します。


1

find . -type f -name *.php -print -exec grep \"class MyClass\" {} \; は、見つかった行の内容とファイルへのパスを提供します。


1

一致したファイルに任意の名前が付いている場合、使用を検討する必要があります -print0

見つける。-type f -name '* .php' -print0 | xargs -0 grep 'class MyClass'


1
grep -rl 'class MyClass' . --include \*.php

lはファイル名のみを表示します

rは再帰的です

。現在のフォルダーで検索

--includeはファイル名拡張子を制限します


1

おそらく、大文字と小文字を区別せず、空白の許容範囲が必要です。現在のディレクトリで目的のファイルパターンのインスタンスが見つからない場合、grepは終了します。どこから始めればよいかを知る必要があり、一致するファイルがなければ開始パスは生成されません。

目的の拡張子のファイルが少なくとも1つある場合は、egrep -irを使用できます。 findまたxargs、grepが失敗する単一のフラット(ただし非常に大きな)ディレクトリと追加の修飾子(たとえば、.inc、.php、およびphp3ファイルのみを検索する場合)で威力を発揮します。しかし、それは私の経験ではかなりの利便性と速度を失います。人間が作成したクラス宣言の場合、大きな問題は空白になります。したがって、grepの代わりにegrepを使用します。また、速度を上げるためLC_ALL = C。便宜上、私はよく使用します:

LC_ALL=C egrep -irn "class[ ]*myclass([ ]|\n)" * | egrep "\.(inc|php[35]?)"

-i -- case insensitive
-r -- recursive for all file pattern (here *)
-n -- include the line number
LC_ALL=C -- search in ASCII, not in utf8, this is much faster.

[ ]* -- match any number of spaces before the class name
([ ]|\n) -- match a space or newline after the classname

これは、などのコメントと一致する// class myclass exists in file場合がありますが、それらは比較的小さいことがわかります。... | fgrep -v '//'

次のように、egrepファイルパターンに、より複雑なファイルマスクを含めることができます(たとえば、ほとんどの.incおよび.phpファイルをキャッチするため)。

egrep "pattern" *.[ip]*

これは(最初のオプションで)非常に高速で、ほとんどがphpファイルに制限されます。

HTH


0

私はそれが使用と言っていることを知っていますgrepが、私の個人的なお気に入りは使用することack-grepです:

ack-grep "class MyClass"

これは再帰的に実行され、結果が見つかったファイル名、それらが見つかった場所の行番号、および強調表示を一覧表示します。phpファイルを具体的にターゲットにするには、次を実行します。

ack-grep --type-set php:ext:php "path"

パッケージには多くのオプションがあります。派手なことをするために、私は間違いなくそれを(そして関連するmanページを閲覧して)お勧めします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.