Как вернуть имя файла и номер строки с помощью find… -exec grep?


45

При использовании find, как я могу вернуть имя файла и номер строки при поиске строки? Мне удается вернуть имя файла в одной команде и номера строк с другой, но я не могу объединить их.

Имена файлов: find . -type f -exec grep -l 'string to search' {} \;

Номера строк: find . -type f -exec grep -n 'string to search' {} \;

Ответы:


51

Переключатель командной строки -Hзаставляет grepпечатать имя файла, даже с одним файлом.

% grep -n 7 test.in
7:7
% grep -Hn 7 test.in
test.in:7:7

   -H, --with-filename
          Print the filename for each match.

Обратите внимание, что, как говорит Кодзиро в комментарии , это не является частью стандарта POSIX; он есть как в GNU, так и в BSD grep, но возможно, что в некоторых системах его нет (например, Solaris).


4
Этот ответ можно улучшить, указав, что -Hфлаг grepявляется нестандартным расширением GNU, и предложив альтернативный подход для не-GNU систем.
Кодзиро

22
find . -type f -exec grep -n 'string to search' /dev/null {} +

(или с GNU grep, смотрите -Hопцию)


оба + и -H работают отлично, спасибо!
Danny_Joris

И связано с этим ответом: unix.stackexchange.com/questions/3682/…
Danny_Joris

4
+1 Правильно, потому что grepналичие нескольких аргументов имени файла вынудит его вывести совпадающие имена файлов. Умная!
Кодзиро

-1

Если ваш grep поддерживает рекурсивный -rфлаг, это решает ваш запрос:

grep -rn "String to search " * 

1
Это правда, но я не вижу, что это добавляет к существующим ответам.
Wildcard

И если в текущем каталоге есть только один (не точечный) файл, он не отображает имя файла.
G-Man говорит «Восстановить Монику»
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.