Jak zwrócić zarówno nazwę pliku, jak i numer linii za pomocą polecenia find… -exec grep?

45

Podczas używania find, jak zwrócić nazwę pliku i numer wiersza podczas wyszukiwania ciągu? Udaje mi się zwrócić nazwę pliku w jednym poleceniu, a numery wierszy w innym, ale nie mogę ich połączyć.

Nazwy plików: find . -type f -exec grep -l 'string to search' {} \;

Numery linii: find . -type f -exec grep -n 'string to search' {} \;

Danny_Joris
źródło

Odpowiedzi:

51

Przełącznik wiersza poleceń -Hwymusza grepwydrukowanie nazwy pliku, nawet z jednym plikiem.

% 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.

Zauważ, że jak powiedział Kojiro w komentarzu , nie jest to część standardu POSIX; jest w grep zarówno GNU, jak i BSD, ale możliwe, że niektóre systemy go nie mają (np. Solaris).

Kevin
źródło
4
Odpowiedź można poprawić, wskazując, że -Hflaga to grepjest niestandardowym rozszerzeniem GNU i stanowi alternatywne podejście do systemów innych niż GNU.
kojiro
22
find . -type f -exec grep -n 'string to search' /dev/null {} +

(lub z GNU grep, patrz -Hopcja)

Stéphane Chazelas
źródło
zarówno +, jak i -H działają świetnie, dziękuję!
Danny_Joris
I powiązany z tą odpowiedzią: unix.stackexchange.com/questions/3682/…
Danny_Joris
4
+1 Racja, ponieważ spowodowanie grepposiadania wielu argumentów nazw plików zmusiłoby go do wyświetlenia dopasowanych nazw plików. Sprytny!
kojiro
-1

Jeśli twój grep obsługuje -rflagę rekurencyjną , to rozwiązuje twoje żądanie:

grep -rn "String to search " * 
Sójka
źródło
1
To prawda, ale nie rozumiem, co to dodaje do istniejących odpowiedzi.
Wildcard
A jeśli w bieżącym katalogu jest tylko jeden plik (bez kropek), nie wyświetla to nazwy pliku.
G-Man mówi „Przywróć Monikę”