Pentru a captura un anumit model, awk
și grep
poate fi folosit. De ce ar trebui să folosim una peste alta? Care este mai rapid și de ce?
Dacă aș avea un fișier jurnal și aș dori să obțin un anumit model, aș putea face una dintre următoarele
awk "/pattern/" /var/log/messages
sau
grep "pattern" /var/log/messages
Nu am făcut nicio analiză comparativă, așa că nu aș ști. Poate cineva să elaboreze acest lucru? Este minunat să cunoașteți funcționarea interioară a acestor două instrumente.
Comentarii
Răspuns
grep va fi cel mai probabil fi mai rapid:
# 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 este un limbaj de programare interpretat, în care grep este un program de cod c compilat (care este optimizat suplimentar pentru a găsi modele în fișiere) .
(Notă – am executat ambele comenzi de două ori, astfel încât cache-ul să nu distorsioneze potențial rezultatele)
Mai multe detalii despre limbile interpretate de pe Wikipedia.
După cum a subliniat pe bună dreptate Stephane în comentarii, kilometrajul dvs. poate varia datorită implementării grep și awk pe care le utilizați, a sistemului de operare pe care este activat și a setului de caractere sunt în procesare.
Comentarii
- Fără a spune ce implementare grep sau awk ‘ folosiți și pe ce arhitectură de computer și cu ce set de caractere de sistem, acele temporizări au o valoare mică.
- a doua comandă va folosi, de asemenea, noul versiune cache. Nu mă îndoiesc că grep este mai rapid, dar nu atât de mult cum arată numerele dvs.
- (prin urmare, rulează awk, grep, awk, grep și postează rezultatele din al doilea set de awk și grep 🙂 și FYI , Locuiesc într-o locație UTF8.
- Destul de amuzant, cu instrumentele BSD (pe un Mac), awk (31.74s) este ușor mai rapid decât sed (33.34s), care este puțin mai rapid decât grep ( 34.21s). Gnu awk le deține pe toate la 5.24s, nu ‘ nu am gnu grep sau sed pentru a testa.
- grep ar trebui să fie puțin mai rapid, deoarece awk face mai multe cu fiecare linie de intrare decât să căutați o regexp în ea, de ex dacă un câmp este menționat în script (pe care ‘ nu îl are în acest caz) awk va împărți fiecare linie de intrare în câmpuri pe baza valorii separatorului de câmp și populează variabilele încorporate. dar cu ceea ce ați postat nu ar trebui să existe aproape nicio diferență. De departe cea cea mai importantă diferență dintre grep și awk wrt potrivesc regexps este că grep caută pe întreaga linie un șir de potrivire, în timp ce awk poate căuta câmpuri specifice și, astfel, oferă mai multă precizie și mai puține potriviri false. >
Răspuns
Utilizați instrumentul cel mai specific și expresiv. Instrumentul care se potrivește cel mai bine cazului dvs. de utilizare este probabil cel mai rapid.
Ca un ghid aproximativ:
- căutați linii care se potrivesc cu un șir sau regexp? Folosiți grep.
- selectarea anumitor coloane dintr-un fișier delimitat simplu? Folosiți tăierea.
- efectuarea substituțiilor bazate pe tipare sau … alte lucruri pe care le poate face în mod rezonabil? Folosiți sed.
- Aveți nevoie de o combinație a celor 3 de mai sus sau de formatare printf sau de bucle și ramuri de uz general? Utilizați awk.
Comentarii
- +1 cu excepția utilizării
perl
în loc deawk
. dacă aveți nevoie de ceva mai complicat decât grep / cut / sed, atunci sunt mari șanse câștigate ‘ nu va fi suficient și aveți nevoie de ceva ” complet -blown ” - @sds de ce nu python în schimb
- @RetroCode: python este mai mult ” scop general ” decât perl; echivalentul cu un singur liner va fi probabil mult mai lung.
- @sds nu, nu aveți nevoie de ‘ decât dacă aveți ‘ voi face altceva decât procesarea textului. awk este foarte bine pentru lucrurile de procesare a textului care ‘ sunt mai complicate decât grep / cut / sed și ca bonus vine ca standard pe toate instalațiile UNIX, spre deosebire de perl.
Răspuns
Când căutați numai șiruri și viteza contează, ar trebui să folosiți aproape întotdeauna grep
. Este „ordinele de mărime mai rapide decât awk
atunci când vine vorba de căutarea doar brută.
sursă Diferențele funcționale și de performanță ale sed, awk și alte utilitare de analiză Unix
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
Comentarii
- Vă mulțumim pentru această prezentare generală frumoasă a tuturor acestor programe. Aruncă într-adevăr lumină în întuneric.
- ~ headtilt ~ PHP este acolo, dar Perl nu este ‘ nu?
- La ce
grep
și la careawk
vă referiți? - Este ‘ nu sunt chiar corecte față de celelalte utilități pe care grep doar le caută și le înlocuiesc.
- Acestea sunt numere complet false. Vorbește despre compararea merelor și a portocalelor – ‘ este ca și cum ai spune că poți doar găsi o mașină nouă pe site-ul web A în 5 secunde, în timp ce poți găsi o mașină , negociați un preț, obțineți un împrumut și cumpărați mașina pe site-ul B în 1 oră, așadar site-ul A este mai rapid decât site-ul B. Articolul pe care l-ați citat este complet greșit în acesta ‘ Declarațiile despre viteza relativă de execuție între grep, sed și awk și mai scrie
awk ... has PCRE matching for regular expressions
, care este complet neadevărat.
Răspuns
Deși sunt de acord că, în teorie, grep
ar trebui să fie mai rapid decât awk
, în practică, YMMV depinde mult de implementarea pe care o utilizați.
aici comparând busybox 1.20.0 „s grep și awk, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 pe Debian / Linux 7.0 amd64 (cu glibc 2.17) într-o localizare UTF-8 pe un fișier de 240 MB de 2,5 milioane de linii de caractere numai 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
În C locale, numai GNU grep primește un impuls semnificativ și devine mai rapid decât mawk
.
Setul de date, tipul regexpului, poate face, de asemenea, o mare diferență. Pentru regexps, awk
ar trebui comparat cu grep -E
întrucât awk
„regexps sunt REs extinse .
Pentru acest set de date, awk
ar putea fi mai rapid decât grep
pe sistemele bazate pe busybox sau pe sistemele în care mawk
este valoarea implicită awk
, iar locația implicită este bazată pe UTF-8 (IIRC, a fost cazul Ubuntu).
Răspuns
Pe scurt, grep
face un lucru doar la fel de multe alte instrumente UNIX și că „potriveste o linie cu modelul dat si o face bine. Pe de altă parte, awk
este un instrument mai sofisticat, deoarece este un limbaj de programare complet definit de standardul POSIX cu caracteristici tipice precum variabile, tablouri, expresii, funcții sau instrucțiuni de control pentru scanarea modelelor și prelucrare.
În opinia mea, depinde de implementarea modului în care funcționează ambele instrumente în cazul potrivirii modelelor și de dimensiunea unor intrări pe care doriți să le procesați. M-aș aștepta ca grep-ul să fie de obicei mai eficient decât awk, deoarece se potrivește numai. Dar nu puteți scrie cu grep un cod simplu pentru a efectua sarcini mai complexe, cum ar fi procesarea ulterioară a înregistrărilor potrivite, calculul sau imprimarea rezultatelor fără a utiliza alte instrumente.
time
pentru a calcula cât timp durează executarea comenzii. Ex:time ls -l
.