Aby uchwycić określony wzorzec, awk i grep można użyć. Dlaczego powinniśmy używać jednego nad drugim? Co jest szybsze i dlaczego?

Gdybym miał plik dziennika i chciałbym pobrać określony wzorzec, mógłbym wykonać jedną z następujących czynności

awk "/pattern/" /var/log/messages 

lub

grep "pattern" /var/log/messages 

Nie wykonałem żadnego testu porównawczego, więc nie wiedziałbym. Czy ktoś może to rozwinąć? Dobrze jest poznać wewnętrzne działanie tych dwóch narzędzi.

Komentarze

  • Wszelkie polecenia, nawet skrypty powłoki, poprzedzaj time do czasu, jaki zajmuje wykonanie polecenia. Np .: time ls -l.

Odpowiedź

grep najprawdopodobniej bądź szybszy:

# time awk "/USAGE/" imapd.log.1 | wc -l 73832 real 0m2.756s user 0m2.740s sys 0m0.020s # time grep "USAGE" imapd.log.1 | wc -l 73832 real 0m0.110s user 0m0.100s sys 0m0.030s 

awk jest interpretowanym językiem programowania, gdzie grep jest skompilowanym programem w kodzie C (który jest dodatkowo zoptymalizowany pod kątem znajdowania wzorców w plikach) .

(Uwaga – uruchomiłem oba polecenia dwukrotnie, aby buforowanie nie wypaczyło potencjalnie wyników)

Więcej szczegółów na temat języków interpretowanych na Wikipedii.

Jak Stephane słusznie zauważył w komentarzach, Twój przebieg może się różnić w zależności od implementacji grep i awk, którego używasz, systemu operacyjnego, na którym jest włączony i zestawu znaków, są przetwarzane.

Komentarze

  • Nie mówiąc, jakiej implementacji grep lub awk ' używasz i włączasz jaka architektura komputera iz jakim zestawem znaków systemowych te czasy mają niewielką wartość.
  • drugie polecenie również użyje nowego wersja z pamięci podręcznej. Nie wątpię, że grep jest szybszy, ale nie tak bardzo, jak pokazują twoje liczby.
  • (stąd uruchamianie awk, grep, awk, grep i wysyłanie wyników z drugiego zestawu awk i grep 🙂 i FYI , Mieszkam w lokalizacji UTF8.
  • Co zabawne, z narzędziami BSD (na Macu) awk (31,74s) jest nieco szybszy niż sed (33,34s), który jest nieco szybszy niż grep ( 34,21s). Gnu awk ma je wszystkie w 5,24s, ja nie ' nie mam do testowania gnu grep ani sed.
  • grep powinien być nieco szybszy, ponieważ awk robi więcej z każdym wiersz wejściowy niż po prostu wyszukaj w nim wyrażenie regularne, np jeśli w skrypcie występuje odniesienie do pola (czego ' nie ma w tym przypadku), awk podzieli każdy wiersz wejściowy na pola na podstawie wartości separatora pól i zapełni zmienne wbudowane. ale z tym, co opublikowałeś, nie powinno być prawie żadnej różnicy. Zdecydowanie najważniejszą różnicą między grep i awk wrt pasującymi wyrażeniami regularnymi jest to, że grep przeszukuje cały wiersz w poszukiwaniu pasującego ciągu, podczas gdy awk może przeszukiwać określone pola, a więc zapewnia większą precyzję i mniej fałszywych dopasowań.

Odpowiedź

Użyj najbardziej szczegółowego i wyrazistego narzędzia. Najprawdopodobniej najszybsze będzie narzędzie, które najlepiej pasuje do Twojego przypadku użycia.

Jako przybliżony przewodnik:

  • wyszukiwanie linii pasujących do podłańcucha lub wyrażenia regularnego? Użyj grep.
  • wybierając określone kolumny z pliku z prostymi separatorami? Użyj wycinania.
  • wykonując podstawienia oparte na wzorcach lub … inne rzeczy, które sed może rozsądnie zrobić? Użyj sed.
  • potrzebujesz kombinacji powyższych 3, formatowania printf lub pętli i gałęzi ogólnego przeznaczenia? Użyj awk.

Komentarze

  • +1 z wyjątkiem perl zamiast awk. jeśli potrzebujesz czegoś bardziej skomplikowanego niż grep / cut / sed, są szanse, że awk won ' nie wystarczy i potrzebujesz czegoś ” pełnego -blown ”
  • @sds dlaczego nie python zamiast tego
  • @RetroCode: python to więcej ” ogólnego przeznaczenia ” niż perl; odpowiednik jednolinijkowy prawdopodobnie będzie znacznie dłuższy.
  • @sds nie, nie ' nie potrzebujesz perla, chyba że ' zamierzam zrobić coś innego niż przetwarzanie tekstu. awk nadaje się dobrze do przetwarzania tekstu, który ' jest bardziej skomplikowany niż grep / cut / sed i jako bonus jest standardem we wszystkich instalacjach UNIX, w przeciwieństwie do perla.

Odpowiedź

Gdy szukasz tylko ciągów i liczy się szybkość, prawie zawsze powinieneś używać grep. Jest to o rząd wielkości szybciej niż awk, jeśli chodzi o zwykłe wyszukiwanie.

źródło Różnice w funkcjonowaniu i wydajności sed, awk i innych uniksowych narzędzi analizujących

UTILITY OPERATION TYPE EXECUTION TIME CHARACTERS PROCESSED PER SECOND (10 ITERATIONS) ------- -------------- --------------- ------------------------------- grep search only 41 sec. 489.3 million sed search & replace 4 min. 4 sec. 82.1 million awk search & replace 4 min. 46 sec. 69.8 million Python search & replace 4 min. 50 sec. 69.0 million PHP search & replace 15 min. 44 sec. 21.2 million 

Komentarze

  • Dziękuję za miły przegląd wszystkich tych programów. Naprawdę rzuca światło w ciemność.
  • ~ headtilt ~ PHP już tam jest, ale Perla nie ma ' t?
  • Do którego grep i do którego awk się odnosisz?
  • To ' jest niesprawiedliwe w stosunku do innych narzędzi, których grep właśnie szuka i które również zastępują.
  • To są całkowicie fałszywe liczby. Porozmawiaj o porównywaniu jabłek i pomarańczy – ' to tak, jakby powiedzieć, że możesz tylko znaleźć nowy samochód na stronie internetowej A w 5 sekund, podczas gdy możesz znaleźć samochód , wynegocjuj cenę, weź pożyczkę i kup samochód w witrynie B w ciągu 1 godziny, dlatego witryna A jest szybsza niż witryna B.Cytowany przez Ciebie artykuł jest w niej całkowicie błędny ' s oświadczenia o względnej szybkości wykonywania między grep, sed i awk, a także awk ... has PCRE matching for regular expressions, co jest całkowicie nieprawdziwe.

Odpowiedź

Chociaż zgadzam się, że teoretycznie grep powinno być szybsze niż awk , w praktyce, YMMV, ponieważ zależy to w dużej mierze od implementacji, której używasz.

tutaj porównując grep busybox 1.20.0 „i awk, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 on Debian / Linux 7.0 amd64 (z glibc 2.17) w lokalizacji UTF-8 w pliku o rozmiarze 240 MB zawierającym 2,5 mln wierszy znaków ASCII.

$ time busybox grep error error | wc -l 331003 busybox grep error error 8.31s user 0.12s system 99% cpu 8.450 total wc -l 0.07s user 0.11s system 2% cpu 8.448 total $ time busybox awk /error/ error | wc -l 331003 busybox awk /error/ error 2.39s user 0.84s system 98% cpu 3.265 total wc -l 0.12s user 1.23s system 41% cpu 3.264 total $ time grep error error | wc -l 331003 grep error error 0.80s user 0.10s system 99% cpu 0.914 total wc -l 0.00s user 0.11s system 12% cpu 0.913 total $ time mawk /error/ error | wc -l 330803 mawk /error/ error 0.54s user 0.13s system 91% cpu 0.732 total wc -l 0.03s user 0.08s system 14% cpu 0.731 total $ time gawk /error/ error | wc -l 331003 gawk /error/ error 1.37s user 0.12s system 99% cpu 1.494 total wc -l 0.04s user 0.07s system 7% cpu 1.492 total $ time 

W C locale, tylko GNU grep zyskuje znaczący wzrost i staje się szybszy niż mawk.

Zestaw danych, typ wyrażenia regularnego również może mieć duże znaczenie. W przypadku wyrażeń regularnych awk należy porównać z grep -E, ponieważ awk „są rozszerzonymi RE .

W przypadku tego zbioru danych awk może być szybsze niż grep w systemach opartych na busybox lub systemach, w których mawk jest domyślnym awk, a domyślnym ustawieniem regionalnym jest UTF-8 (IIRC, tak było w Ubuntu).

Odpowiedź

Krótko mówiąc, grep robi tylko jedną rzecz, tak jak wiele innych narzędzi UNIX. dopasowuje linię do podanego wzorca i robi to dobrze. Z drugiej strony awk jest bardziej wyrafinowanym narzędziem, ponieważ jest kompletnym językiem programowania zdefiniowanym przez standard POSIX z typowymi cechami, takimi jak zmienne, tablice, wyrażenia, funkcje lub instrukcje sterujące do skanowania wzorców i przetwarzanie.

Moim zdaniem to zależy od implementacji, jak oba narzędzia będą działać w przypadku dopasowania wzorców oraz od rozmiaru niektórych danych wejściowych, które chcesz przetworzyć. Spodziewałbym się, że grep jest zwykle bardziej wydajne niż awk, ponieważ robi tylko dopasowywanie. Ale nie można napisać w grep prostego kodu do wykonywania bardziej złożonych zadań, takich jak dalsze przetwarzanie dopasowanych rekordów, obliczenia lub drukowanie wyników bez użycia innych narzędzi.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *