Вопрос по bash, shell – Напишите скрипт оболочки, который находит greps и выводит имя файла и содержимое в 1 строку
Чтобы увидеть все 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
чтобы получить желаемый результат
Использовать-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 -H abc *.php
... что дает вам желаемый результат.-H
является поведением по умолчанию (по крайней мере, в версии grep для OS X), поэтому вы можете пропустить это:
grep abc *.php
Вы можете grep рекурсивно используя-R
флаг, но вы не можете ограничить его.php
файлы:
grep -R abc *
Опять же, это имеет тот же желаемый результат.
Я знаю, что это не совсем точный ответ на ваши вопросы, это просто ... альтернатива ... Выше приведены просто grep с одним флагом, поэтому их легче запомнить, чемfind
/-exec
/grep
/xargs
комбинаций! (не относится к сценарию, но полезно для повседневной работы с оболочкой)