Как я ищу строку в файле PHP с помощью 'grep'?

Я ищу объявление класса на сайте с сотнями файлов PHP. Как я могу сделать это в текущей папке и подпапках с помощью grep?

Я протестировал cdлуг к папке и затем чему-то как

grep -r 'class MyClass' *.php
11
задан 06.04.2012, 17:44

5 ответов

Если Вы используете -r, Вы, вероятно, хотите рекурсивно искать просто текущий каталог:

grep -r 'class MyClass' .

Отметьте период на конце вышеупомянутого.

Что Вы сказали grep было это, Вы хотели, чтобы это рекурсивно искало каждый *.php файл или каталог, но у Вас, вероятно, не было каталогов, которые закончились в .php расширении. Вышеупомянутое является самым простым способом сделать поиск, но также и включает файлы других типов, который особенно проблематичен, когда у Вас есть .svn каталоги везде. Если у Вас нет большого количества других типов файлов, вышеупомянутое обычно достаточно и работает хорошо.

Большинство воплощений grep не имеет способа указать расширения файла, которые могут искаться, таким образом, Вы обычно используете, находят в сочетании с ним:

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

-iname говорит некоторым версиям grep, что Вы хотите сделать нечувствительный к регистру поиск имени файла, но многие не варианты GNU находки не поддерживают его, таким образом, Вы могли использовать -name вместо этого.

-exec опция выше имеет побочный эффект вызова grep для каждого файла, который является довольно дорогостоящим.

Тем не менее другие версии grep поддерживают a + который говорит, находят для добавления аргументов вместе для сокращения количества вызовов исполняемого файла:

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

Часто рекомендуемый способ уменьшить вызовы состоит в том, чтобы использовать xargs, который будет исчерпывать grep, так же мало раз столь же возможный, но так же много раз по мере необходимости:

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

xargs достаточно умно для передачи grep до максимального количества аргументов, поддерживаемых на командной строке, но вышеупомянутое изменение не обрабатывает определенные символы как пробелы очень хорошо. Например, был 'file.php' имя файла grep, получит как аргумент и 'file.php' как аргумент, таким образом, оба не были бы найдены. Вместо этого мы используем:

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

print0 и -0 сотрудничайте и используйте аргументы, сопровождаемые нулевым символом так, чтобы аргумент был полностью и однозначно определен.

f Вы когда-либо имеют больше чем одно пространство после class, или вкладка, Вы могли бы хотеть позволить больше символов путем изменения regex: class[ \t]*MyClass

Это сообщение на StackOverflow имеет другие примеры и демонстрирует, как исключить определенные каталоги, как .svn каталоги.

4
ответ дан 07.12.2019, 12:10

Я рекомендовал бы, чтобы Вы использовали что-то как ctags, а не сделали это с grep. Однако, если Вы хотите, можно сделать что-то как

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

Это, конечно, предполагает, что у Вас есть просто одиночный пробел между class и myClass который не мог бы быть верным. Легко изменить regexp для поиска любого количества пробелов все же.

9
ответ дан 07.12.2019, 12:10
grep -r 'class MyClass' *.php

перероет все папки с именами, заканчивающимися .php

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

будет искать класс MyClass во всех файлах во всех sub папках, затем только возвратите тех, которые имеют .php в них.

1
ответ дан 07.12.2019, 12:10

Используя когда-либо замечательный ack,

ack --php 'class MyClass'
3
ответ дан 07.12.2019, 12:10

find . -type f -name *.php -print -exec grep \"class MyClass\" {} \; даст Вам содержание строки его найденный на, а также путь к файлу.

1
ответ дан 07.12.2019, 12:10

Теги

Похожие вопросы