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
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 “
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 melyikawk
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.
time
parancs, hogy mennyi időbe telik a parancs futtatása. Például:time ls -l
.