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 -n
i, -l
ale 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?
Odpowiedzi:
Myślę, że
-l
jest 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
-o
wydrukować tylko pasującą część.grep -nHo "search" *
źródło
grep -rin searchstring * | cut -d: -f1-2
Oznaczałoby to wyszukiwanie rekurencyjne (dla ciągu
searchstring
w 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ścioweuniq
, aby zobaczyć każdą nazwę pliku tylko raz:grep -ir searchstring * | cut -d: -f1 | uniq
źródło
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 :)źródło
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
źródło
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.
źródło