linux + znajdź słowo / ciąg w pliku w katalogu

4

Mam następujące polecenie

find /var -type f -exec grep "param1" {} \; -print

Za pomocą tego polecenia mogę znaleźć ciąg param1 w dowolnym pliku w katalogu / var, ale czas potrzebny na to jest bardzo długi.

Potrzebuję innej możliwości znalezienia ciągu w pliku, ale znacznie szybciej niż w moim przykładzie

Yael
źródło
@yael: Jak długi jest „bardzo długi?” Minuta, godzina, dzień? Może pomożesz nam odpowiedzieć na twoje niejednoznaczne pytania, zanim zaczniemy na tym, tak?
Mike Fitzpatrick
Przestań publikować to samo pytanie na StackOverflow i SuperUser.
Dennis Williamson

Odpowiedzi:

5

Możesz spróbować użyć grep bezpośrednio jak w

grep -R "param1" /var/*
Pan Shunz
źródło
2
a nawetgrep -R "param1" /var
Kevin M
+1 zdecydowanie do zrobienia, a także możesz użyć -lopcji drukowania tylko nazw pasujących plików zamiast rzeczywistych pasujących linii w plikach.
David Z
1

szybkie wyszukiwanie uzyskuje się głównie poprzez „indeks” treści, rodzaj „tablicy odnośników”. istnieją pewne bezpłatne wyszukiwarki, które budują indeks plików wejściowych i dają bardzo, bardzo szybkie wyniki:

wątpię, czy chcesz pójść tą drogą, ale po prostu dać ci inną opcję :)

akira
źródło
zindeksowana treść jest zwykle wykonywana tylko dla rzeczy, których zmiany nie powinny się znacząco zmieniać. Przez „znacząco” mam na myśli dodawanie setek linii przy każdym uruchomieniu, takich jak pliki w katalogu / var.
Kevin M
@Kevin M.: „Wątpię, czy chcesz iść tą drogą” zostało celowo tam umieszczone. czy powinienem umieścić wady podejścia indeksowanego w odpowiedzi?
akira
1

Istnieje tu kilka czynników:

Po pierwsze , za pomocą -execfind znajduje nowy proces grepdla każdego znalezionego pliku.

Można to zarządzać albo za pomocą xargs, jak w odpowiedzi Felipe Alvareza (napisałem wpis na blogu o tym ponad 5 lat temu) lub za pomocą -exec grep param1 {} +(zwróć uwagę na +zamiast \;). Podczas używania +„linia poleceń jest budowana poprzez dołączenie na końcu każdej wybranej nazwy pliku; całkowita liczba wywołań polecenia będzie znacznie mniejsza niż liczba pasujących plików” (ze strony podręcznika wyszukiwania )

Po drugie , liczba i rozmiar plików poniżej /varjest potencjalnie bardzo duża.

Czy możesz dodatkowo dodać parametry, -type faby ograniczyć wyszukiwanie plików? findma opcje ograniczania czasu, właściciela, wzorca nazwy itp. Na przykład możesz:

find /var -type f -name "access*log" -mtime -7 -exec grep param1 {} +

Dzięki temu pliki zmodyfikowane w ciągu ostatnich siedmiu dni będą miały nazwy zaczynające się od „access” i kończące się na „log”. Tylko te pasujące pliki będą częścią exec / grep.

Doug Harris
źródło
0

znajdź ... [bla] ..... -print0 | xargs -0 grep -e „regex”

Felipe Alvarez
źródło
0

Radzę używać:

grep -RInis "param1" /var

Aby uzyskać więcej informacji zobacz

man grep

Jeśli prędkość ma tak duże znaczenie, możesz rozważyć użycie fgrep, który może nie okazać się szybszy w zależności od implementacji.

Dlf
źródło