Pokaż nazwę pliku i numer linii w danych wyjściowych grep

87

Próbuję przeszukać katalog rails przy użyciu grep. Szukam konkretnego słowa i chcę grep wydrukować nazwę pliku i numer wiersza.

Czy jest flaga grep, która zrobi to za mnie? Próbowałem użyć kombinacji -ni, -lale te albo drukują nazwy plików bez numerów, albo po prostu wyrzucają dużo tekstu do terminala, którego nie można łatwo odczytać.

dawny:

  grep -ln "search" *

Czy muszę przekierować to do awk?

trev9065
źródło

Odpowiedzi:

138

Myślę, że -ljest zbyt restrykcyjny, ponieważ blokuje wyjście -n. Sugerowałbym -H( --with-filename): Wydrukuj nazwę pliku dla każdego dopasowania.

grep -Hn "search" *

Jeśli daje to zbyt dużo wyników, spróbuj -owydrukować tylko pasującą część.

grep -nHo "search" * 
Spokeadoke
źródło
Ta odpowiedź zadziałała również dla mnie. Potrzebowałem wyszukiwania rekurencyjnego i użyłem tego przykładowego polecenia: grep -Hnor "localhost". Ta lista zawiera wszystkie dopasowania wraz z nazwą pliku i numerem linii, krótkie i zwięzłe.
Tore Aurstad
Wyświetla również wynik, a nie tylko nazwę pliku i numer wiersza
elig
30
grep -rin searchstring * | cut -d: -f1-2

Oznaczałoby to wyszukiwanie rekurencyjne (dla ciągu searchstringw tym przykładzie), ignorowanie wielkości liter i wyświetlanie numerów wierszy. Wynik tego grepa będzie wyglądał mniej więcej tak:

/path/to/result/file.name:100: Line in file where 'searchstring' is found.

Następnie przesyłamy ten wynik do polecenia cut za pomocą dwukropka : jako separatora pól i wyświetlając pola od 1 do 2.

Kiedy nie potrzebuję numerów wierszy, których często używam -f1(tylko nazwa pliku i ścieżka), a następnie potokuj dane wyjściowe uniq, aby zobaczyć każdą nazwę pliku tylko raz:

grep -ir searchstring * | cut -d: -f1 | uniq
JBW
źródło
1
Czuję, że to najlepiej odpowiada na pierwotne pytanie. Tylko nazwy plików i numery wierszy.
mastaBlasta
1
Zwróć uwagę, że to nie działa, jeśli masz bezwzględne nazwy ścieżek systemu Windows, takie jak `C: \ Users \ me \ git`, ponieważ zawiera już jeden dwukropek.
hirse
19

Lubię używać:

grep -niro 'searchstring' <path>

Ale to tylko dlatego, że zawsze zapominam o innych drogach iz jakiegoś powodu nie mogę zapomnieć Roberta de grep -niro :)

Bas van Ommen
źródło
Nigdy nie myślałem, że dostanę za powyższe głosy. Po prostu fajna akcja. Dzięki! (Ale to naprawdę działa - przynajmniej na MacOS)
Bas van Ommen
Uwielbiam sposób, w jaki o tym pamiętasz!
Greg Hilston
0

Komentarz z @ToreAurstad można przeliterować grep -Horn 'search' ./, co jest łatwiejsze do zapamiętania.

grep -HEroine 'search' ./ może też zadziałać;)

Dla ciekawskich:

$ grep --help | grep -Ee '-(H|E|r|o|i|n|e),'
  -E, --extended-regexp     PATTERNS are extended regular expressions
  -e, --regexp=PATTERNS     use PATTERNS for matching
  -i, --ignore-case         ignore case distinctions
  -n, --line-number         print line number with output lines
  -H, --with-filename       print file name with output lines
  -o, --only-matching       show only nonempty parts of lines that match
  -r, --recursive           like --directories=recurse
Uderzenie
źródło
0

Oto jak użyłem odpowiedzi za głosem, aby przeszukać drzewo w celu znalezienia plików fortran zawierających ciąg:

find . -name "*.f" -exec grep -nHo the_string {} \;

Bez nHo dowiesz się tylko, że jakiś plik gdzieś pasuje do łańcucha.

Karol I.
źródło