Aby uchwycić określony wzór awk
i grep
można go użyć. Dlaczego powinniśmy używać jednego nad drugim? Który jest szybszy i dlaczego?
Gdybym miał plik dziennika i chciałbym pobrać określony wzór, mógłbym wykonać jedną z następujących czynności
awk '/pattern/' /var/log/messages
lub
grep 'pattern' /var/log/messages
Nie przeprowadziłem żadnych testów porównawczych, więc nie wiedziałbym. Czy ktoś może to rozwinąć? Wspaniale jest znać wewnętrzne działanie tych dwóch narzędzi.
linux
awk
grep
performance
holasz
źródło
źródło
time
poleceniem, aby określić, ile czasu zajmuje wykonanie polecenia. Nptime ls -l
. :Odpowiedzi:
grep najprawdopodobniej będzie szybszy:
awk jest zinterpretowanym językiem programowania, w którym grep jest skompilowanym programem w kodzie c (który jest dodatkowo zoptymalizowany pod kątem wyszukiwania wzorców w plikach).
(Uwaga - uruchomiłem oba polecenia dwa razy, aby buforowanie potencjalnie nie wypaczyło wyników)
Więcej informacji na temat tłumaczonych języków na wikipedii.
Jak słusznie zauważył Stephane w komentarzach, twój przebieg może się różnić ze względu na implementację grep i awk, którego używasz, systemu operacyjnego, na którym jest on włączony, i zestawu znaków, który przetwarzasz.
źródło
Użyj najbardziej konkretnego i wyrazistego narzędzia. Narzędzie, które najlepiej pasuje do Twojego przypadku, będzie prawdopodobnie najszybsze.
Jako przybliżony przewodnik:
źródło
perl
zamiastawk
. jeśli potrzebujesz czegoś bardziej skomplikowanego niż grep / cut / sed, wówczas szanse na awk nie wystarczą i potrzebujesz czegoś „w pełni rozwiniętego”Gdy szukasz tylko ciągów znaków i prędkości, prawie zawsze powinieneś używać
grep
. Jest o rząd wielkości szybszy niż wawk
przypadku zwykłego wyszukiwania.źródło Różnice funkcjonalne i wydajnościowe sed, awk i innych narzędzi parsujących Unixa
źródło
awk ... has PCRE matching for regular expressions
co jest całkowicie nieprawdziwe.Chociaż zgadzam się, że teoretycznie
grep
powinien być szybszy niżawk
, w praktyce, YMMV, ponieważ zależy to w dużej mierze od implementacji, której używasz.porównując grep i awk z busybox 1.20.0, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 na Debian / Linux 7.0 amd64 (z glibc 2.17) w ustawieniach regionalnych UTF-8 na 240 MB pliku o wielkości 2,5M linii Znaki tylko ASCII.
W języku C tylko GNU grep otrzymuje znaczący wzrost i staje się szybszy niż
mawk
.Zbiór danych, typ wyrażenia regularnego może również mieć duże znaczenie. W przypadku wyrażeń regularnych
awk
należy je porównać zgrep -E
jakawk
„s wyrażenia regularne są rozszerzone Res.W przypadku tego zestawu danych
awk
może być szybszy niżgrep
w systemach opartych na busyboksie lub systemach, w którychmawk
jest to ustawienie domyślne,awk
a domyślne ustawienia regionalne to UTF-8 (IIRC, tak było kiedyś w Ubuntu).źródło
W skrócie,
grep
robi jedną rzecz tylko tyle samo, co wiele innych narzędzi UNIX, a to dopasowuje linię do podanego wzorca i robi to dobrze. Z drugiej stronyawk
jest bardziej zaawansowanym narzędziem, ponieważ jest to kompletny język programowania zdefiniowany przez standard POSIX z typowymi funkcjami, takimi jak zmienne, tablice, wyrażenia, funkcje lub instrukcje sterujące do skanowania i przetwarzania wzorów.Moim zdaniem zależy to od implementacji wydajności obu narzędzi w przypadku dopasowania wzorca i wielkości niektórych danych wejściowych, które chcesz przetworzyć. Spodziewałbym się, że grep jest zwykle bardziej wydajny niż awk, ponieważ tylko dopasowuje. Ale nie można pisać za pomocą 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.
źródło