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: 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/*

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ę :)


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.



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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.