grep - wyświetla nazwę pliku, w którym znaleziono dopasowanie

31

Mam kilka plików .html w katalogu. Chcę przejrzeć każdy plik i dopasować wzór (MD5). Wszystko to jest dość łatwe. Problem polega na tym, że muszę wiedzieć, w jakim pliku znaleziono dopasowanie.

cat *.html | grep 75447A831E943724DD2DE9959E72EE31

Zwraca tylko treść strony HTML, w której znaleziono dopasowanie, ale nie mówi mi, w którym pliku został znaleziony. Jak mogę uzyskać grep, aby pokazał mi nazwę pliku, w którym znaleziono moje dopasowanie?

Być moim przyjacielem
źródło
Podana sugestia naprawdę nie działa .... Wszystko, co otrzymuję, to cat * .html | grep -i -H 1ee024007823cc0bfbefba98ba1e1f4c (standardowe wejście): <html> <head> <title>
BeMy Friend
4
brakuje ci sensu. Nie musisz używać kota. Kot uniemożliwia grepowi rozróżnianie poszczególnych plików.
muru
Przydatny może być ten post przepełnienia stosu .
Pablo A

Odpowiedzi:

32
grep -H 75447A831E943724DD2DE9959E72EE31 *.html

-H, --with-filename
              Print the file name for each match. This is
              the default when there is more than one file
              to search.
Cyrus
źródło
3
Jak mówi, jest to ustawienie domyślne dla wielu plików, więc dopóki jest więcej niż jeden plik HTML, -Hnie jest konieczne.
muru
1
Przepraszam, moje pytanie było obraźliwe. Powinienem był powiedzieć, że pracuję nad tym przez jakiś czas i użyłem wielu przełączników ORAZ przeczytałem stronę MAN, na której jest napisane, że domyślnie wyświetla nazwę pliku .... Ale otrzymuję (standardowe wejście ), gdzie powinna zawierać nazwę pliku.
BeMy Friend,
i to tylko wtedy, gdy dam przełącznik -H. Jeśli robię tylko to, co wymieniłem w OP, to nie podaje żadnej nazwy pliku.
BeMy Friend,
3
@BeMyFriend, problem jest cat. catoznacza konkatenat. Jeśli połączysz wszystkie pliki razem przed ich przekazaniem grep, grepzobacz tylko jeden duży standardowy plik wejściowy i nie możesz (bez robienia wróżenia) zwrócić ci żadnych informacji o pojedynczych plikach. Widzieć?. Cyrus, co powiesz na wyjaśnienie tego w odpowiedzi?
Rmano
OK, problemem jest polecenie cat, ale co może być rozwiązaniem?
Josef Klimuk
20

Korzystam z tego cały czas, aby szukać plików zawierających ciąg, POWTARZAJĄCY się w katalogu (co oznacza, przechodzenie przez dowolny podfolder podrzędny) grep -Ril "yoursearchtermhere"

  • R jest wyszukiwanie rekurencyjne (następujące dowiązania symboliczne)
  • i sprawi, że wielkość liter będzie niewrażliwa
  • l służy tylko do wyświetlenia nazwy plików.

więc odpowiedź na twoje pytanie grep -l '75447A831E943724DD2DE9959E72EE31' *.htmlwystarczy, ale możesz po prostu grep -Ril '75447A831E943724DD2DE9959E72EE31'wyszukać ten ciąg bez rozróżniania wielkości liter w dowolnym pliku w dowolnym podfolderze

bugbinder
źródło
macOS zawsze wymaga pliku def, może to być symbol wieloznaczny. W przeciwnym razie zakłada wejście od stdin( grep: ostrzeżenie: rekursywne wyszukiwanie stdin , cokolwiek rekurencyjne wejście stdin oznaczałoby :-). Innymi słowy:grep -Ril 'texttofind' *
Ville,
grep -RiH 'pattern'pokazuje nazwę pliku i dopasowaną linię
Ikrom
7

Możesz tego spróbować

grep -rl '75447A831E943724DD2DE9959E72EE31' * > found.txt
Czerwona Aura
źródło
2
grep -r -H 75447A831E943724DD2DE9959E72EE31 *.html | awk -F : ' { print $1 } '

Alternatywa dla

grep -r -l 75447A831E943724DD2DE9959E72EE31 *.html

Wykonanie powyższego spowoduje wyszukiwanie rekurencyjne w folderze i podfolderach i wydrukowanie ścieżki do pliku ...

Drew
źródło
grep -r -l to jedyna rzecz, która mi zadziałała.
Josef Klimuk
0

Odpowiedź wysłane przez Cyrusa jest absolutnie właściwe i jest właściwym sposobem TM to zrobić ze grepjeśli tylko trzeba znaleźć pliki . Gdy nazwy plików wymagają dodatkowego parsowania lub operacji na dopasowanych nazwach plików, możemy skorzystać z whilepętli z ifinstrukcją. Oto przykład, w którym lista nazw plików pochodzi z bardzo często używanej struktury find+ whiledo bezpiecznego parsowania nazw plików.

find -type f -name "*.html" -print0 | while IFS= read -r -d '' filename
do
    if grep -q 'PATTERN' "$filename"
    then
        printf "%s found in %s\n" 'PATTERN' "$filename"
        # Here we can insert another command or function
        # to perform other operations on the filename
    fi
done
Sergiy Kolodyazhnyy
źródło
1
Powiązane: Rekurencyjnie wyszukiwać wzór / tekst tylko w podanej nazwie pliku katalogu? , Zwłaszcza Muru za odpowiedź wykazując grep„s --includeflagę.
Eliah Kagan