Egy adott minta rögzítéséhez awk és grep használható. Miért kellene használnunk egyiket a másikon? Melyik gyorsabb és miért?

Ha lenne naplófájlom, és meg szeretnék ragadni egy bizonyos mintát, akkor a következők egyikét tehetném:

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

vagy

grep "pattern" /var/log/messages 

Még nem végeztem benchmarkingot, ezért nem tudnám. Tudja valaki ezt részletezni? Nagyon jó ismerni ennek a két eszköznek a belső működését.

Megjegyzések

  • Minden parancsot, még a shell parancsfájlokat is, megelőz a time parancs, hogy mennyi időbe telik a parancs futtatása. Például: time ls -l.

Válasz

a grep valószínűleg gyorsabb legyen:

# 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 

az awk egy értelmezett programozási nyelv, ahol a grep egy lefordított c-kód program (amely ráadásul a fájlok mintáinak keresésére optimalizált) .

(Megjegyzés – Mindkét parancsot kétszer futtattam, hogy a gyorsítótárazás ne torzítsa az eredményeket)

További információ az értelmezett nyelvekről a wikipédián.

Amint Stephane helyesen rámutatott a megjegyzésekben, a futásteljesítmény változhat a használt grep és awk megvalósítása, az operációs rendszer és a karakterkészlet miatt folyamatban vannak.

Megjegyzések

  • Anélkül, hogy megmondaná, milyen grep vagy awk implementációt használ ‘ milyen számítógépes architektúrával és melyik rendszer karakterkészlettel rendelkezik, ezek az időzítések kevés értékkel bírnak.
  • a második parancs az újonnan használt gyorsítótárazott változat. Nem kételkedem abban, hogy a grep gyorsabb, de nem annyival, amennyit a számai mutatnak.
  • (ezért fut az awk, a grep, az awk, a grep és közzéteszi az eredményeket a második awk és grep halmazból 🙂 és FYI , UTF8 nyelven élek.
  • Elég vicces, hogy a BSD eszközökkel (Mac gépen) az awk (31,74s) valamivel gyorsabb, mint a sed (33,34s), ami valamivel gyorsabb, mint a grep ( 34,21s). A Gnu awk mindegyikének 5.24s-nál van a tulajdonsága, én nem tesztelhetem a gnu grep-et vagy a sed-et.
  • A grep-nek valamivel gyorsabbnak kell lennie, mert az awk többet csinál mindegyikkel beviteli sor, mint csak egy regexp keresése benne, pl ha egy mezőre hivatkozunk a szkriptben (amely ‘ ebben az esetben nem), akkor az awk minden bemeneti sort mezőkre oszt majd a mezőelválasztó értéke alapján, és beépíti a beépített változókat. de azzal, amit közzétett, szinte semmi különbség nem lehet. Messze a legfontosabb különbség a grep és az awk wrt megfelelő regexps között az, hogy a grep az egész sorban keres egyező karakterláncot, míg az awk bizonyos mezőkben kereshet, így nagyobb pontosságot és kevesebb hamis egyezést eredményez. >

Válasz

Használja a legspecifikusabb és legkifejezőbb eszközt. Valószínűleg a leggyorsabb az az eszköz, amely a legjobban illeszkedik a felhasználási esetéhez.

Körülbelüli útmutató:

  • keressen egy vonalat vagy egy aloldalt? Használja a grep parancsot.
  • bizonyos oszlopok kiválasztása egy egyszerűen elválasztott fájlból? Használja a vágást.
  • mintalapú helyettesítések vagy … egyéb dolgok, amelyeket ésszerűen megtehet? Használja a sed.
  • szükség van a fenti 3 valamilyen kombinációjára, vagy printf formázásra, vagy általános célú hurkokra és ágakra? Használja az awk parancsot.

Megjegyzések

  • +1, kivéve a perl használatát id = “e077497fba”>

. ha valami bonyolultabb dologra van szükséged, mint a grep / cut / sed, akkor valószínű, hogy az awk nem lesz ‘ elég, és valami ” teljesre van szükséged -blown “

  • @sds miért ne Python helyett
  • @RetroCode: a python inkább ” általános célú ” mint a perl; az egyenértékű egyhuzalos valószínűleg sokkal hosszabb lesz.
  • @sds nem, akkor nem kell ‘ perl, kivéve, ha ‘ a szövegfeldolgozáson kívül mást fog tenni. Az awk kiválóan alkalmas azoknak a szövegfeldolgozó dolgoknak, amelyek ‘ bonyolultabbak, mint a grep / cut / sed, és bónuszként alapértelmezés szerint minden UNIX telepítésnél szerepel, a perl-től eltérően.

    Válasz

    Ha csak karakterláncokat keres, és a sebesség számít, akkor szinte mindig használja a következőt: grep. Ez nagyságrendekkel gyorsabb, mint a awk, ha csak durva keresésről van szó.

    forrás A sed, awk és más Unix elemző segédprogramok funkcionális és teljesítménybeli különbségei

    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 

    Megjegyzések

    • Köszönöm ezeket a programokat. Ez valóban fényt derít a sötétségben.
    • ~ A headtilt ~ PHP be van kapcsolva, de Perl nem ‘ t?
    • Melyik grep és melyik awk mire hivatkozik?
    • Ez ‘ nem igazán tisztességes a többi olyan eszközzel szemben, amelyet a grep csak keres, és ők is helyettesítenek.
    • Ezek teljesen hamis számok. Beszéljen az alma és a narancs összehasonlításáról – ez ‘ olyan, mintha azt mondaná, hogy csak új autót találhat az A weboldalon 5 másodperc alatt, míg autót találhat , tárgyaljon egy árról, szerezzen hitelt, és 1 órán belül vásárolja meg az autót a B oldalon, így az A webhely gyorsabb, mint a B webhely. Az Ön által idézett cikk teljesen téves ‘ s a relatív végrehajtási sebességre vonatkozó utasítások a grep, sed és awk között, és azt is mondja, hogy awk ... has PCRE matching for regular expressions, ami teljesen valótlan.

    Válasz

    Bár egyetértek azzal, hogy elméletileg a grep -nek gyorsabbnak kell lennie, mint a awk , a gyakorlatban az YMMV, mivel ez nagyban függ az Ön által alkalmazott megvalósítástól.

    itt összehasonlítjuk a busybox 1.20.0 “s grep és awk, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 Debian / Linux 7.0 amd64 (glibc 2.17-gyel) egy UTF-8 területi beállításban, 240 MB-os fájlban, amely csak 2,5 millió soros, csak ASCII karaktereket tartalmaz.

    $ 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 

    a C területi beállítások mellett csak a GNU grep kap jelentős lendületet és gyorsabb lesz, mint a mawk.

    Az adatkészlet, a regexp típusa szintén nagy változást hozhat létre. A regexps esetében a awk -et össze kell hasonlítani a grep -E -vel, mivel a awk “regexps kiterjesztett RE-k .

    Ennél az adatkészletnél a awk gyorsabb lehet, mint a grep busbox alapú rendszereken vagy olyan rendszereken, ahol mawk az alapértelmezett awk, és az alapértelmezett területi beállítás UTF-8 alapú (IIRC, ez az Ubuntu esetében szokott lenni).

    Válasz

    Dióhéjban a grep egy dolgot csak annyit csinál, mint annyi más UNIX eszköz, és hogy “s egy vonalat illeszt az adott mintához, és ez jól megcsinálja. Másrészt a awk kifinomultabb eszköz, mivel a POSIX szabvány által definiált teljes programozási nyelv, tipikus jellemzőkkel, mint változók, tömbök, kifejezések, függvények vagy vezérlő utasítások a mintaszkenneléshez és feldolgozás.

    Véleményem szerint a megvalósítástól függ, hogy mindkét eszköz hogyan teljesít minta illesztése esetén, és néhány feldolgozni kívánt bemenet méretétől. Arra számítok, hogy a grep általában hatékonyabb, mint az awk, mivel csak az illeszkedik. De nem írhat grep segítségével egy egyszerű kódot olyan bonyolultabb feladatok végrehajtásához, mint az egyező rekordok további feldolgozása, számítás vagy az eredmények nyomtatása más eszközök használata nélkül.

  • Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük