Tietyn mallin kaappaamiseksi, awk ja grep voidaan käyttää. Miksi meidän pitäisi käyttää toisiaan? Mikä on nopeampi ja miksi?

Jos minulla olisi lokitiedosto ja halusin napata tietyn mallin, voisin tehdä jonkin seuraavista

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

tai

grep "pattern" /var/log/messages 

En ole tehnyt vertailua, joten en tiedä. Voisiko joku tarkentaa tätä? On hienoa tietää näiden kahden työkalun sisäinen toiminta.

Kommentit

  • Edeltää kaikki komennot, jopa komentosarjat, time -komento ajoi kuinka kauan komennon suorittaminen kestää. Esimerkki: time ls -l.

Vastaa

grep todennäköisesti olla nopeampi:

# 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 on tulkittu ohjelmointikieli, jossa grep on käännetty c-koodiohjelma (joka on lisäksi optimoitu tiedostojen mallien löytämiseen) .

(Huomaa – Juoksin molemmat komennot kahdesti, jotta välimuisti ei mahdollisesti vääristä tuloksia)

Lisätietoja tulkituista kielistä wikipediassa.

Kuten Stephane on perustellusti huomauttanut kommenteissa, mittarilukema voi vaihdella käyttämiesi grep- ja awk-sovellusten, käytössä olevan käyttöjärjestelmän ja merkistöjen vuoksi käsittelemme.

Kommentit

  • Sanomatta mitä grep- tai awk-toteutusta ’ käytät ja jatkat millä tietokonearkkitehtuurilla ja millä järjestelmän merkistöillä kyseisillä ajoituksilla on vain vähän arvoa.
  • toinen komento käyttää myös uutta välimuistissa oleva versio. Epäilen, että grep on nopeampi, mutta ei niin paljon kuin numerosi osoittavat.
  • (siis käynnissä awk, grep, awk, grep ja tulosten lähettäminen toisesta awk ja grep sarjasta 🙂 ja FYI , Asun UTF8-kielellä.
  • Riittävän hauska, BSD-työkaluilla (Macissa) awk (31,74s) on hieman nopeampi kuin sed (33,34s), mikä on hieman nopeampi kuin grep ( 34,21 s). Gnu awk omistaa ne kaikki 5,24 sekunnilla, minulla ei ’ ole testattavia gnu grep- tai sed-testejä.
  • grepin pitäisi olla hieman nopeampi, koska awk tekee enemmän jokaisen kanssa syöttörivi kuin vain etsiä regexp siitä, esim jos kenttään viitataan komentosarjassa (jota se ’ ei tässä tapauksessa), awk jakaa jokaisen syöttörivin kentiksi kenttäerottimen arvon perusteella ja täyttää sisäänrakennetut muuttujat. mutta julkaisemiesi tietojen kanssa ei pitäisi olla melkein mitään eroa. Ylivoimaisesti tärkein ero grepin ja awk wrt: n vastaavien regexps: n välillä on se, että grep etsii koko riviltä vastaavaa merkkijonoa, kun taas awk voi etsiä tiettyjä kenttiä ja antaa siten tarkkuutta ja vähemmän vääriä vastaavuuksia. >

Vastaus

Käytä tarkinta ja ilmeisintä työkalua. Käyttötapaukseesi parhaiten sopiva työkalu on todennäköisesti nopein.

Karkeana oppaana:

  • etsitkö osajonoa tai regexp-vastaavia viivoja? Käytä grepiä.
  • tiettyjen sarakkeiden valitseminen yksinkertaisesti erotetusta tiedostosta? Käytä leikkaa.
  • suorittamalla kuvioihin perustuvia korvauksia tai … muita asioita, joita voi kohtuudella tehdä? Käytä sed.
  • tarvitsetko jonkin edellä olevan 3 yhdistelmän, printf-muotoilun tai yleiskäyttöisten silmukoiden ja haarojen yhdistelmän? Käytä awk.

Kommentit

  • +1 paitsi käytä perl awk. Jos tarvitset jotain monimutkaisempaa kuin grep / cut / sed, on todennäköistä, että awk ei riitä ’ t riitä ja tarvitset jotain ” täynnä -puhallettu ”
  • @sds miksi ei pythonia
  • @RetroCode: python on enemmän ” yleiskäyttöinen ” kuin perl; vastaava yhden linjan pituus on todennäköisesti paljon pidempi.
  • @sds ei, et tarvitse ’ perl-tiedostoa, ellet ’ aiot tehdä jotain muuta kuin tekstinkäsittelyä. awk sopii mainiosti tekstinkäsittelytiedoille, jotka ’ ovat monimutkaisempia kuin grep / cut / sed ja bonuksena on vakiona kaikissa UNIX-asennuksissa, toisin kuin perl.

vastaus

Kun etsit vain merkkijonoja ja nopeutta, sinun on melkein aina käytettävä grep. Se on suuruusluokkaa nopeampi kuin awk, kun kyse on vain karkeasta hausta.

lähde Sed-, awk- ja muiden Unix-jäsentelyapuohjelmien toiminnalliset ja suorituskykyerot

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 

Kommentit

  • Kiitos hienosta yleiskatsauksesta kaikista näistä ohjelmista. Se todella valaisee pimeyttä.
  • ~ headtilt ~ PHP on päällä, mutta Perl ei ole ’ t?
  • Mihin grep ja mihin awk viitat?
  • Se ’ eivät ole oikeastaan oikeudenmukaisia muiden sellaisten utilien kanssa, joita grep vain etsii, ja ne myös korvaavat.
  • Ne ovat täysin vääriä numeroita. Keskustele omenoiden ja appelsiinien vertailusta – se ’ haluaa sanoa, että voit vain löytää uuden auton verkkosivustolta A 5 sekunnissa, kun taas auton löydät , neuvottele hinta, hanki laina ja osta auto paikan päällä B tunnissa, joten sivusto A on nopeampi kuin sivusto B. Lainamasi artikkeli on siinä täysin väärä ’ s suhteellisen suoritusnopeuden lausunnot grepin, sedin ja awk: n välillä, ja siinä sanotaan myös awk ... has PCRE matching for regular expressions, joka on täysin epätosi.
  • Vastaa

    Vaikka olen samaa mieltä siitä, että teoriassa grep pitäisi olla nopeampi kuin awk , käytännössä YMMV, koska se riippuu paljon käyttämästäsi toteutuksesta.

    tässä verrataan busybox 1.20.0: n grep ja awk, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 päällä Debian / Linux 7.0 amd64 (with glibc 2.17) UTF-8-kielialueella 240 Mt: n tiedostossa, jossa on vain 2,5 M riviä vain ASCII-merkkejä.

    $ 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 

    C locale, vain GNU grep saa merkittävän lisäyksen ja nopeutuu kuin mawk.

    Myös datajoukolla, regexp-tyypillä voi olla suuri ero. Regexps-koodien kohdalla awk tulisi verrata grep -E -ohjelmaan, koska awk ”regexps ovat laajennettuja RE: itä .

    Tämän tietojoukon awk voi olla nopeampi kuin grep väylälaatikkoihin perustuvissa järjestelmissä tai järjestelmissä, joissa mawk on oletusarvoinen awk ja oletuskieli on UTF-8-pohjainen (IIRC, se oli aiemmin Ubuntussa).

    vastaus

    Lyhyesti sanottuna grep tekee yhtä asiaa kuin monet muut UNIX-työkalut ja että ”s sovittaa viivan annettuun kuvioon ja tekee sen hyvin. Toisaalta awk on kehittyneempi työkalu, koska se on täydellinen POSIX-standardin määrittämä ohjelmointikieli, jolla on tyypillisiä ominaisuuksia, kuten muuttujat, taulukot, lausekkeet, toiminnot tai ohjauslausekkeet kuvien skannaukseen ja käsittely.

    Minusta se riippuu toteutuksesta, kuinka molemmat työkalut toimivat kuvion sovittamisen yhteydessä, ja joidenkin syötettävien syötteiden koosta. Odotan, että grep on yleensä tehokkaampi kuin awk, koska se vastaa vain. Mutta et voi kirjoittaa grepillä yksinkertaista koodia monimutkaisempien tehtävien suorittamiseksi, kuten vastaavien tietueiden jatkokäsittely, laskenta tai tulosten tulostaminen ilman muita työkaluja.

    Vastaa

    Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *