Имена файлов и номера строк для совпадений cat и grep

Мой код

$  *.php | grep google

Как я могу напечатать имена файлов и номера строк рядом с каждым совпадением?


person Léo Léopold Hertz 준영    schedule 26.02.2009    source источник


Ответы (5)


grep google *.php

если вы хотите охватить много каталогов:

find . -name \*.php -print0 | xargs -0 grep -n -H google

(как объясняется в комментариях, -H полезен, если xargs выдает только один оставшийся файл)

person cadrian    schedule 26.02.2009
comment
Последний код находит подкаталоги или главные каталоги? - person Léo Léopold Hertz 준영; 26.02.2009
comment
Вам нужно имя, потому что вы можете не знать, какой это был файл, особенно если это плохо, что xargs объединил вещи и остался один файл. - person Jonathan Leffler; 26.02.2009
comment
Не забывайте, что вы должны использовать -print0 для поиска и -0 для xargs, если вы работаете в дереве каталогов, в именах которых есть такие вещи, как встроенные пробелы. - person Michael Trausch; 27.02.2009
comment
@ Джонатан и Майкл: да, ты прав. Но я привел самый распространенный случай. @Masi: подкаталоги - person cadrian; 27.02.2009
comment
Ваша первая строка не печатает имена файлов и номера, вторая рекурсия (чего Маси не имел в виду). найти . -maxdepth 1 -имя *.php -print0 | xargs -0 grep -nH Google подойдет. - person DevSolar; 27.03.2009
comment
Почему вы используете -print0 и xargs -0? Какая польза? - person Abhijeet Rastogi; 10.10.2012
comment
прочитайте предыдущие комментарии ;-) во всяком случае сейчас я бы просто найти . -name *.php -exec grep -Hn {} google \; - person cadrian; 10.10.2012

Вы не должны делать

$ *.php | grep

Это означает «запустить первую программу PHP с именами остальных, обозначенными подстановочными знаками в качестве параметров, а затем запустить grep на выходе».

Так должно быть:

$ grep -n -H "google" *.php

Флаг -n говорит ему делать номера строк, а флаг -H говорит ему отображать имя файла, даже если есть только файл. Grep по умолчанию будет отображать имена файлов, если ищется несколько файлов, но вы, вероятно, захотите убедиться, что вывод непротиворечив, независимо от того, сколько есть подходящих файлов.

person Alnitak    schedule 26.02.2009

Пожалуйста, взгляните на подтверждение на http://betterthangrep.com. Эквивалент того, что вы пытаетесь сделать:

ack google --php
person Andy Lester    schedule 08.04.2010

Используйте «man grep», чтобы увидеть другие функции.

for i in $(ls *.php); do  grep -n --with-filename "google" $i; done;
person J.J.    schedule 26.02.2009
comment
это не сработает - входной файл является стандартным, когда команда написана таким образом - person Alnitak; 26.02.2009

person    schedule
comment
Получаются имена файлов, но не номера строк, не так ли? - person Jonathan Leffler; 06.04.2010