C'è ancora qualche motivo per imparare AWK?


109

Imparo costantemente nuovi strumenti, anche quelli antiquati, perché mi piace usare la soluzione giusta per il problema.

Tuttavia, mi chiedo se ci sia ancora qualche motivo per impararne alcuni. awkper esempio, è interessante per me, ma per una semplice elaborazione del testo, posso usare grep, cut, sed, ecc mentre per quelli complessi, andrò per Python.

Ora non voglio dire che non sia uno strumento potente e pratico. Ma dal momento che ci vuole tempo ed energia per imparare un nuovo strumento, ne vale la pena ?


2
è il 2019 e ho appena riscritto un normalizzatore di log Python in awk. Ho eseguito la trasformazione su una settimana di file di registro che erano 54 milioni di file di registro di riga (~ 9 GB). Sul mio Macbook Pro (2.8 GHZ i7, 16 GB Ram), la versione python potrebbe elaborare ~ 10k righe al secondo => 90 minuti di runtime. Usando mawk, il tempo di esecuzione si è ridotto a 2 minuti. A proposito, il programma awk era la metà delle dimensioni.
mistahenry

@mistahenry hai provato pypy?
qwr

Risposte:


97

Penso che dipenda dall'ambiente in cui ti trovi. Se sei una persona * nix, allora sapere awkè una buona cosa. L'unico altro ambiente di scripting che può essere trovato praticamente su ogni * nix è sh. Quindi grep, mentre , sed,ecc.Può sicuramente sostituire awkuna moderna linuxdistribuzione mainstream , quando passi a sistemi più esotici, sapere un po awk'sarà davvero utile.

awkpuò essere utilizzato anche per qualcosa di più della semplice elaborazione del testo. Ad esempio, uno dei miei supervisori scrive codice di astronomia in awk- questo è quanto sia assolutamente vecchio stile e fantastico . Ai suoi tempi, era lo strumento migliore per il lavoro ... e ora anche se i suoi studenti come me usano python e cosa no, si attacca a ciò che conosce e funziona bene.

In conclusione, ci sono un sacco di vecchi codici in giro per il mondo, sapere che un po awk'non farà male. Ti renderà anche migliore * nix persona :-)


12
++ D'accordo, awk è davvero uno degli strumenti più portabili e, soprattutto, coerenti nel set di strumenti * nix. Funziona in modo affidabile su busybox, ad esempio, dove perl non si trova da nessuna parte.
pistole

1
E non è davvero così difficile da imparare se sei abituato a usare il tutore riccio
pistole

2
"È lo stesso in qualsiasi ambiente" - non proprio: in Windows le virgolette singole devono essere sostituite con doppie, se le doppie interne devono essere eliminate. (Windows è una specie di ambiente reale, anche se esporsi all'atrocimità insicura e incompleta di Redmond ti mette alla mercé di qualsiasi quindicenne russo).
GT.

6
Non credo che molte persone associno l'esistenza di awk e di Windows nello stesso universo .....: P
FoldedChromatin

2
Uso ancora awk per i lavori di elaborazione del testo. Spesso avvierò uno script in qualcos'altro (ruby, python) e finirò per tornare in awk per la semplicità e la potenza.
Rumbleweed

104

Se impari rapidamente le basi di awk, puoi davvero fare cose incredibili sulla riga di comando.

Ma la vera ragione per imparare awk è avere una scusa per leggere il superbo libro The AWK Programming Language dei suoi autori Aho, Kernighan e Weinberger. Penseresti, dal nome, che ti insegna semplicemente awk. In realtà, questo è solo l'inizio. Lancio nella vasta gamma di problemi che possono essere affrontati una volta che si utilizza un linguaggio di scripting conciso che semplifica la manipolazione delle stringhe - e awk è stato uno dei primi - si procede insegnando al lettore come implementare un database, un parser, un interprete e (se la memoria mi serve) un compilatore per un piccolo linguaggio per computer specifico per il progetto! Se solo avessero programmato anche un sistema operativo di esempio usando awk, il libro sarebbe stato un'introduzione al sondaggio abbastanza completa all'informatica!

Notoriamente chiaro e conciso, come il libro originale in linguaggio C, è anche un meraviglioso esempio di scrittura tecnica amichevole fatta bene. Anche l'indice è un pezzo di artigianato.

Awk? Se lo conosci, lo userai occasionalmente dalla riga di comando, ma per qualcosa di più grande ti sentirai intrappolato, incapace di accedere alle funzionalità più ampie del tuo sistema e di Internet a cui qualcosa come Python fornisce l'accesso. Ma il libro? Sarai sempre felice di leggerlo!


5
+1 venduto. Ordinerò questo libro. Uso awk da anni come linguaggio di scripting veloce e potente. Awk è un ottimo pre-processore per file che altrimenti richiederebbero una dozzina di righe per il codice. Non riesco a contare quante volte ho usato il modulo: awk '{print $ 1, $ 2}'
galaxywatcher

2
Concordato. Sfida quasi a credere quanto sia compatto quel libro dato a tutto ciò che contiene. Copre più della maggior parte dei libri contemporanei in 1/10 (?) Di lunghezza.
argilla

3
Sto leggendo questo libro ora e ha infiammato il mio entusiasmo per awk fino a diventare quasi un'ossessione.
galaxywatcher

3
Vedi anche l'eccellente Gawk: Effective AWK Programming .
lhf

1
Ho appena letto il primo capitolo. È stupefacente. Mistery risolto.
vaichidrewar

29

L'unico motivo che uso awkè la suddivisione automatica:

awk '{print $3}' < file.in

Stampa il terzo campo delimitato da spazi in file.in. È un po 'più facile di:

tr -s ' ' < file.in | cut -d' ' -f3

3
perché usare awk '{print $3}' < file.ininvece di awk '{print $3}' file.in? Awk non legge già i file quando vengono passati come argomenti?
mbigras

@mbigras Certo, puoi usare awk in entrambi i casi.
Greg Hewgill

Anche con il doppio, mi piace la soluzione non awk. E non so perché odio awk: /
MD. Mohiuddin Ahmed

25

Penso che awk sia fantastico se il tuo file contiene colonne / campi . Lo uso durante l'elaborazione / l'analisi di una particolare colonna in un file a più colonne. O se voglio aggiungere / eliminare una o più colonne particolari.

per esempio

awk -F \t '{ if ($2 > $3) print; }' <filename>

verrà stampato solo se il valore della seconda colonna in un file separato da tabulazioni è maggiore del valore della terza colonna.

Ovviamente potrei usare Perl o Python, ma awk lo rende molto più semplice con un conciso comando a riga singola.

Anche l'apprendimento di awk è piuttosto economico. Puoi imparare le basi di awk in meno di un'ora, quindi non è tanto faticoso quanto imparare qualsiasi altro linguaggio di programmazione / scripting.


Sebbene io non usi molto awk, questo è un ottimo uso per awk.
Paul Nathan,

8

Di tanto in tanto uso AWK per gestire l'HTML. Ad esempio, questo codice traduce le tabelle in file csv:

BEGIN {s=""; FS="n"}
/<td/ { gsub(/<[^>]*>/, ""); s=(s ", " $1);}
/<tr|<TR/ { print s; s="" }

Il che è fantastico se stai raschiando lo schermo. In realtà, potrebbe essere il caso che io ami AWK perché mi permette di costruire la soluzione sbagliata ai problemi così rapidamente :) più esempi . È anche menzionato nelle adorabili perle di programmazione di Jon Bentley .


7

Uso awk ogni tanto. Va bene per il testo molto semplice che si mescola nel mezzo di una pipeline; riempie una nicchia molto stretta tra il non averne affatto bisogno e il bisogno di tirare fuori Perl / Python / qualunque cosa.

Non ti consiglierei di dedicarci molto tempo, ma potrebbe tornare utile conoscere le basi della sintassi - almeno abbastanza da poter consultare rapidamente il manuale se volessi usarlo.


5

La maggior parte degli awk one liners può essere ottenuta con Perl one liners, se si sceglie di entrare in una mentalità Perl one liner. Oppure, usa solo tre righe Perl :)

Se stai mantenendo script di shell scritti da qualcuno a cui piace awk, allora chiaramente, avrai bisogno di imparare awk.

Anche se non ce n'è bisogno pratico, se conosci già regex non ci vorrà molto per raccogliere le basi, ed è divertente vedere come le cose sono state progettate allora. È piuttosto elegante.


5

6 anni dopo aver posto questa domanda ora posso rispondere con certezza: no, imparare awk non vale la pena.

Le attività di base sono gestibili ma semplici comandi bash o anche strumenti GUI facilmente. Compiti più complessi potranno essere facilmente affrontati con linguaggi dinamici moderni come Python (fav o mine) o Ruby.

Dovresti sicuramente imparare un linguaggio dinamico di scripting moderno poiché ti aiuterà in così tante attività (web, amministrazione, scricchiolio dei dati, automazione, ecc.). E così facendo l'apprendimento di strumenti come awk è completamente inutile, ti farà risparmiare al massimo qualche secondo ogni mese.


2
Non necessariamente vero. Se stai analizzando file molto grandi, potrebbe essere molto più veloce di altri strumenti.
user1071847

Interessante perché alcuni anni dopo stai ancora facendo domande su awk. Ero uno dei soccorritori originali e lo uso ancora con una certa regolarità fino ad oggi
Dexygen

4

Se già conosci e usi sed, potresti anche raccogliere almeno un po 'di awk. Possono essere messi insieme per alcuni trucchi piuttosto potenti. Impressiona sempre il pubblico.


4

Computerworld ha recentemente rilasciato un'intervista con Alfred V. Aho (uno dei tre creatori di AWK) su AWK. È una lettura piuttosto interessante. Quindi forse troverai alcuni suggerimenti, perché è una buona idea imparare AWK.


Bello, ma non mi ha convinto. AWK è uno strumento molto buono, ma penso che non ne avrò mai abbastanza per prenderti il ​​tempo di impararlo invece di hackerare la mia soluzione in sed o python.
e-satis

4

Imparare AWK è stato inestimabile per me nel mio ultimo contratto di lavoro su un sistema Linux incorporato su cui non erano installati né Perl né la maggior parte degli altri linguaggi di scripting.


2
9 anni dopo e ho usato molto awk oggi mentre ingaggiavo i log di git
Dexygen

3

awk ha un ottimo rapporto utilità / difficoltà, e "simple awk" funziona in ogni Unix / Linux / MacOS (e può essere installato anche in altri sistemi).

È stato progettato nell'età dell'oro quando le persone odiavano digitare, quindi gli script possono essere molto, molto brevi e veloci da scrivere. Proverò a installare mawk, una versione veloce, presumibilmente accelera il calcolo di circa 9 volte, awk / gawk è piuttosto lento, quindi se vuoi usarlo al posto di R ecc. Potresti volere mawk.


2

È utile soprattutto se devi occasionalmente analizzare i file di log per i dati o l'output di programmi durante lo scripting della shell, perché è molto facile ottenere in awk che ciò richiederebbe un po 'più di righe di codice in Python.

Certamente ha più potere di quello, ma sembra che siano compiti per cui la maggior parte delle persone lo usa.


2

Ovviamente: sto lavorando in un ambiente in cui le uniche lingue disponibili sono: (qualche linguaggio schifoso che genera COBOL, OMG, OMG), bash (vecchia versione), perl (non lo padroneggio ancora), sed, awk e alcune altre utilità della riga di comando. La conoscenza awkmi ha fatto risparmiare diverse ore (e aveva generato diversi compiti di elaborazione del testo dai miei colleghi - vengono da me almeno tre volte al giorno).


1

Direi che probabilmente non ne vale più la pena. Di tanto in tanto lo uso come un editor di flusso molto più versatile di sed con capacità di ricerca incluse, ma se sei esperto di python non conosco un'attività che potresti finire molto più velocemente per compensare il tempo necessario per imparare awk.

Il seguente comando è probabilmente l'unico per cui ho usato awk negli ultimi due anni (elimina i pacchetti rimossi a metà dai miei sistemi Debian / Ubuntu):

$ dpkg -l|awk '/^rc/ {print $2}'|xargs sudo dpkg -P

1

No.

Anche se potrebbe essere interessante, puoi fare tutto ciò che awk può fare usando altri strumenti più potenti come Perl.

Dedica il tuo tempo ad apprendere questi strumenti più potenti e solo incidentalmente raccogli qualche disagio lungo la strada.


1

Direi che c'è. Per cose semplici, AWK è molto più facile per l'amministratore di sistema / sviluppatore inesperto rispetto a Python. Puoi imparare un po 'di AWK e fare molte cose, imparare Python significa imparare una lingua completamente nuova (sì, lo so che anche AWK è una lingua è un senso).

Perl potrebbe essere in grado di fare molte cose che AWK può fare, ma offrendo la possibilità di scegliere in questo giorno ed età sceglierei Python qui. Quindi sì, dovresti imparare AWK. ma impara anche Python :-)


1

awkè un linguaggio powertool, quindi probabilmente troverai awkusato da qualche parte se sei un professionista IT di qualsiasi tipo. Se riesci a gestire la sintassi e le espressioni regolari di grepe, sednon dovresti avere problemi a captare awke probabilmente ne vale la pena.

Quello che ho trovato awkdavvero brillante è nella semplificazione di cose come l'elaborazione di record multilinea e la manipolazione / interpolazione di più file contemporaneamente.


0

Ora che PERL è stato portato su praticamente tutte le piattaforme significative, direi che non ne vale la pena. È più versatile di sed e awk insieme. Per quanto riguarda la suddivisione automatica, puoi farlo in perl in questo modo:

perl -F':' -ane 'print $F[3],"\n";' /etc/passwd

EDIT: si potrebbe ancora voglia di farsi un po ' conoscere awk, perché alcuni altri strumenti si basano sulla sua filosofia di azioni modello a base (ad esempio, su Solaris DTrace).


0

Lavoro nell'area i file sono in formato colonna. Quindi awk è inestimabile per me RIFORMATTA il file in modo che diversi software possano lavorare insieme. Per i professionisti non IT, l'uso di awk è sufficiente e perfetto. Ora un giorno, la velocità del computer non è un problema, quindi posso combinare awk e unix per convogliare molti comandi di 1 liner in uno "script". Con Awk ricerca per campo e record, lo uso per controllare i dati del file molto velocemente, invece di "vi" per aprire un file. Devo dire che la capacità di awk ha portato gioia al mio lavoro, in particolare, sono in grado di aiutare i colleghi a risolvere rapidamente le cose usando awk. Codice incredibile per me.


0

Recentemente stavo cercando di visualizzare i file pcap di rete che registrano un attacco DOS che ammontava a oltre 20 Gb. Avevo bisogno del timestamp e degli indirizzi IP. Nel mio scenario, AWK one-liner ha funzionato favolosamente e anche abbastanza velocemente. Ho utilizzato specificamente AWK per pulire i file estratti, ottenere gli indirizzi IP e il conteggio totale dei pacchetti da quegli indirizzi IP entro un periodo di tempo raggruppato. Sono totalmente d'accordo con ciò che altre persone hanno scritto sopra. Dipende dai tuoi bisogni.


0

Una ragione per NON imparare awk è che non ha corrispondenze non avide nelle espressioni regolari.

Ho un codice awk che ora devo riscrivere solo perché ho improvvisamente eseguito il debug che non esistono corrispondenze non avide in awk / gawk quindi non può eseguire correttamente alcune regex.


0

Dipende dai tuoi compagni di squadra, dal tuo leader e dal compito su cui stai lavorando.

if( team mates and leader ask to write awk ){
  if( you can reject that){
    if( awk code is very small){
      learn little just like learn Regex
    }else{
      use python or even java
    }
  }else{
    do as they ask
  }
}

0

Al momento sto scrivendo del codice in Python. Ma ancora non lo conosco abbastanza bene da usarlo facilmente per semplici trasformazioni di file una tantum.

Con awk posso sviluppare rapidamente un pezzo di codice di una riga sulla riga di comando di Unix che esegue alcune trasformazioni piuttosto veloci. Ogni volta che utilizzo awk, il pezzo di codice che scrivo sarà usa e getta e non sarà lungo più di poche righe. Forse una dichiarazione "if" e una dichiarazione "printf" qua o là su una riga.

Non ho mai scritto un pezzo di codice lungo più di 10 righe con awk. Ho visto alcuni di questi script anni fa.

Ma tutto ciò che richiedeva molte righe di codice, ricorrevo a Python.

Amo awk. È uno strumento molto potente in combinazione con sed.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.