Вопрос по bash, shell – Напишите скрипт оболочки, который находит greps и выводит имя файла и содержимое в 1 строку

3

Чтобы увидеть все php-файлы, которые содержат & quot; abc & quot; Я могу использовать этот простой скрипт:

find . -name "*php" -exec grep -l abc {} \;

Я могу опустить -l, и я получаю некоторую часть содержимого вместо имен файлов в результате:

find . -name "*php" -exec grep abc {} \;

То, что я хотел бы сейчас, - это версия, которая делает оба одновременно, но на одной линии.

Ожидаемый результат:

path1/filename1: lorem abc ipsum
path2/filename2: ipsum abc lorem
path3/filename3: non abc quod

Более или менее какgrep abc * делает.

Edit: Я хочу использовать это как простой сценарий оболочки. Было бы замечательно, если бы вывод был в одной строке, поэтому дальнейшее сопоставление было бы возможно. Но не обязательно, чтобы скрипт был только одной строкой, я все равно помещаю его в файл скрипта bash.

Edit 2: Позже я обнаружил «ack», который является отличным инструментом, и я использую его сейчас в большинстве случаев вместо grep. Это делает все это и многое другое.http://betterthangrep.com/ Ты бы написалack --php --nogroup abc чтобы получить желаемый результат

Ваш Ответ

3   ответа
7

Использовать-H переключатель (man grep):

find . -name "*php" -exec grep -H abc {} \;

Альтернативное использованиеxargs (теперь-H Переключатель не нужен, по крайней мере, для версииgrep У меня тут)

find . -name "*php" -print | xargs grep abc

Edit: Как следствиеgrepповедение, отмеченноеorsogufoвторая команда выше должна использовать-H еслиfind можно было бы вернуть только одно имя файла (то есть, если есть только один файл PHP). Если комментарий orsogufo's w.r.t.-print0 также включена, команда становится:

find . -name "*php" -print0 | xargs -0 grep -H abc

Edit 2: А (больше1) POSIX совместимая версия, предложеннаяДжонатан Леффлер, который за счет использования/dev/null избегает-H переключатель:

find . -name "*php" -print0 | xargs -0 grep abc /dev/null

1: Цитата изРуководство opengroup.org поfind намекает на то, что-print0 Нестандартно:

A feature of SVR4's find utility was the -exec primary's + terminator. This allowed filenames containing special characters (especially s) to be grouped together without the problems that occur if such filenames are piped to xargs. Other implementations have added other ways to get around this problem, notably a -print0 primary that wrote filenames with a null byte terminator. This was considered here, but not adopted. Using a null terminator meant that any utility that was going to process find's -print0 output had to add a new option to parse the null terminators it would now be reading.

Обратите внимание, что другой способ справиться с возможностью передачи одного файла в grep - добавить / dev / null к команде, поэтому у grep всегда есть как минимум два файла для поиска. '-H'; опция для grep не является частью спецификации POSIX - это полезное расширение GNU.
Интересный момент. Обновил ответ соответственно.
-H не нужен с xargs, потому что grep получает более одного файла в командной строке и в этом случае выводит имя файла вместе с захватом; Я думаю, что это стандартное поведение, и оно должно работать также на greps, отличных от вашего. Обратите внимание, что было бы лучше использовать & apos; find ... -print0 & apos; и направить вывод в «xargs -0», чтобы использовался разделитель 0, и ваша команда будет работать также с неприятными именами файлов (например, содержащими пробелы).
Спасибо за ваш комментарий. Я обновил ответ.
Я немного погуглил и понял, что -print0 не совместим с POSIX ... см. В нижней части этой страницы:opengroup.org/onlinepubs/009695399/utilities/find.html
1
find /path -type f -name "*.php" | awk '
{
    while((getline line<$0)>0){
        if(line ~ /time/){
            print $0":"line
            #do some other things here
        }
    }    
}'
2

grep -H abc *.php

... что дает вам желаемый результат.-H является поведением по умолчанию (по крайней мере, в версии grep для OS X), поэтому вы можете пропустить это:

grep abc *.php

Вы можете grep рекурсивно используя-R флаг, но вы не можете ограничить его.php файлы:

grep -R abc *

Опять же, это имеет тот же желаемый результат.

Я знаю, что это не совсем точный ответ на ваши вопросы, это просто ... альтернатива ... Выше приведены просто grep с одним флагом, поэтому их легче запомнить, чемfind/-exec/grep/xargs комбинаций! (не относится к сценарию, но полезно для повседневной работы с оболочкой)

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