2013-07-02 09:24:45 +0000 2013-07-02 09:24:45 +0000
83
83

Znajdowanie plików, które zawierają określony ciąg znaków za pomocą find (1) i grep (1)

find . -type f -print -exec cat {} \; | grep some string

Powyższa komenda nie drukuje ścieżki do pliku.

Używam: Ubuntu, bash 4.

Odpowiedzi (5)

117
117
117
2013-07-02 12:01:16 +0000

Używam

grep "some string" . -R

i działa to szybciej

p.s.

Bardziej złożony przypadek użycia

grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex

Aby odczytać param i wyjaśnienie

grep --help | grep -- -i
```.
98
98
98
2013-07-02 10:02:41 +0000

Dzieje się tak dlatego, że podajesz grep strumień tekstu, który tak się składa, że zawiera nazwy plików. Ponieważ nie podałeś żadnych nazw plików jako argumentów grepowi, nie można oczekiwać, że wywnioskuje on, z jakiego pliku pochodzi dopasowana linia. Użyj xargs:

find . -type f -print | xargs grep "some string"

Ponieważ masz GNU find/xargs, jest to bezpieczniejszy sposób, aby xargs czytał nazwy plików:

find . -type f -print0 | xargs -0 grep "some string"

Jeśli chcesz tylko nazwy plików, które mają pasującą linię, bez pokazywania pasującej linii:

find . -type f -print0 | xargs -0 grep -l "some string"
```.
14
14
14
2014-09-26 13:24:22 +0000

Często szukam kodu źródłowego w złożonych strukturach folderów i przydaje mi się użycie:

cd /your/folder/
grep -rHino "your string"

Z tymi parametrami, bez użycia find, otrzymuję pełną ścieżkę do pliku oraz numer linii, która zawiera określony ciąg znaków.

Jest to również łatwe do zapamiętania, ponieważ BASHes przez wyszukiwanie jak rHino :)

Pokażę jak to działa na krótkim przykładzie.

Wyświetlmy zawartość pliku używając cat:

jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

I wyszukajmy rekursywnie wszystkie pliki zawierające ciąg “iptables -P”:

jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P

Jak widać na wyjściu mamy filename:hit row:searched string

Oto dokładniejszy opis użytych parametrów:

-r Dla każdego operandu katalogu, odczytaj i przetwórz wszystkie pliki w tym katalogu, rekurencyjnie. Podążaj za dowiązaniami symbolicznymi w wierszu poleceń, ale pomijaj dowiązania, które są napotykane rekurencyjnie. Zauważ, że jeśli nie podano operandu plik, grep przeszukuje katalog roboczy. Jest to to samo co opcja ‘–directories=recurse’.

-i Wypisuje nazwę pliku dla każdego dopasowania. Jest to wartość domyślna, gdy jest więcej niż jeden plik do przeszukania.

-n Przedrostek każdej linii wyjściowej numerem linii w pliku wejściowym, liczonym od 1. (-n jest określone przez POSIX.)

-H Wypisuje nazwę pliku dla każdego dopasowania. Jest to wartość domyślna, gdy do przeszukania jest więcej niż jeden plik.

-o Drukuje tylko dopasowane (niepuste) części pasujących linii, z każdą taką częścią w osobnej linii wyjściowej. Linie wyjściowe używają tych samych ograniczników co wejściowe, a ogranicznikami są bajty zerowe, jeśli użyto również -z (–null-data) (zobacz Inne opcje).

2
2
2
2015-10-28 19:03:56 +0000

Wolałem

| znajdź plik |make grep ont finding file | show de full path of the file

find / -type f -exec grep ‘some string’ {} \; -exec echo {} \;;

0
0
0
2018-10-22 16:15:38 +0000

Silver Searcher ](https://github.com/ggreer/the_silver_searcher) jest bardzo szybkim i poręcznym narzędziem do wyszukiwania plików i treści.

Aby rozwiązać twój problem, komenda silver searcher wyglądałaby tak…

ag 'some string' -l

-l Wypisuje tylko nazwy plików, które zawierają dopasowania (nie wypisuje pasujących linii)