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
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
zamiastawk
. 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óregoawk
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.
time
do czasu, jaki zajmuje wykonanie polecenia. Np .:time ls -l
.