Awk è un potente strumento di analisi del testo per sistemi Unix e simili a Unix, ma poiché ha funzioni programmate che puoi utilizzare per eseguire attività di analisi comuni, è anche considerato un linguaggio di programmazione . Probabilmente non svilupperai la tua prossima applicazione GUI con awk e probabilmente non sostituirà il tuo linguaggio di scripting predefinito, ma è una potente utility per attività specifiche.
Quali possono essere questi compiti è sorprendentemente diverso. Il modo migliore per scoprire quale dei tuoi problemi potrebbe essere risolto al meglio da awk è imparare awk; rimarrai sorpreso di come awk possa aiutarti a fare di più ma con molto meno sforzo.
La sintassi di base di Awk è:
awk [options] 'pattern {action}' file
Per iniziare, crea questo file di esempio e salvalo come colours.txt
name color amount
apple red 4
banana yellow 6
strawberry red 3
grape purple 10
apple green 8
plum purple 2
kiwi brown 4
potato brown 9
pineapple yellow 5
Questi dati sono separati in colonne da uno o più spazi. È comune che i dati che stai analizzando siano organizzati in qualche modo. Potrebbero non essere sempre colonne separate da spazi bianchi, o anche da una virgola o da un punto e virgola, ma soprattutto nei file di registro o nei dump di dati, esiste generalmente uno schema prevedibile. Puoi utilizzare modelli di dati per aiutare awk a estrarre ed elaborare i dati su cui vuoi concentrarti.
Stampa di una colonna
In awk, la stampa la funzione mostra tutto ciò che specifichi. Ci sono molte variabili predefinite che puoi usare, ma alcune delle più comuni sono numeri interi che designano colonne in un file di testo. Provalo:
$ awk '{print $2;}' colours.txt
color
red
yellow
red
purple
green
purple
brown
brown
yellow
In questo caso, awk mostra la seconda colonna, indicata da $2 . Questo è relativamente intuitivo, quindi puoi probabilmente immaginare che stampa $ 1 visualizza la prima colonna e stampa $ 3 visualizza il terzo e così via.
Per visualizzare tutti colonne, utilizza $0 .
Il numero dopo il simbolo del dollaro ($ ) è un'espressione , quindi $ 2 e $(1+1) significa la stessa cosa.
Selezione condizionale delle colonne
Il file di esempio che stai utilizzando è molto strutturato. Ha una riga che funge da intestazione e le colonne si riferiscono direttamente l'una all'altra. Definendo condizionale requisiti, puoi qualificare ciò che desideri che awk restituisca quando guardi questi dati. Ad esempio, per visualizzare gli elementi nella colonna 2 che corrispondono a "giallo" e stampare il contenuto della colonna 1:
awk '$2=="yellow"{print $1}' colours.txt
banana
pineapple
Anche le espressioni regolari funzionano. Questo condizionale guarda a $ 2 per corrispondenze approssimative alla lettera p seguito da un numero qualsiasi di (uno o più) caratteri, che sono a loro volta seguiti dalla lettera p :
$ awk '$2 ~ /p.+p/ {print $0}' colours.txt
grape purple 10
plum purple 2
I numeri sono interpretati naturalmente da awk. Ad esempio, per stampare qualsiasi riga con una terza colonna contenente un numero intero maggiore di 5:
awk '$3>5 {print $1, $2}' colours.txt
name color
banana yellow
grape purple
apple green
potato brown
Separatore di campo
Per impostazione predefinita, awk utilizza gli spazi bianchi come separatore di campo. Tuttavia, non tutti i file di testo utilizzano gli spazi bianchi per definire i campi. Ad esempio, crea un file chiamato colours.csv con questo contenuto:
name,color,amount
apple,red,4
banana,yellow,6
strawberry,red,3
grape,purple,10
apple,green,8
plum,purple,2
kiwi,brown,4
potato,brown,9
pineapple,yellow,5
Awk può trattare i dati esattamente allo stesso modo, purché tu specifichi quale carattere dovrebbe usare come separatore di campo nel tuo comando. Usa il --separatore di campo (o semplicemente -F in breve) opzione per definire il delimitatore:
$ awk -F"," '$2=="yellow" {print $1}' file1.csv
banana
pineapple
Salvataggio output
Utilizzando il reindirizzamento dell'output, puoi scrivere i risultati in un file. Ad esempio:
$ awk -F, '$3>5 {print $1, $2} colours.csv > output.txt
Questo crea un file con il contenuto della tua query awk.
Più risorse Linux
- Comandi Linux cheat sheet
- Cheat sheet sui comandi avanzati di Linux
- Corso online gratuito:Panoramica tecnica RHEL
- Cheat sheet della rete Linux
- Cheat sheet di SELinux
- Cheat sheet dei comandi comuni di Linux
- Cosa sono i container Linux?
- I nostri ultimi articoli su Linux
Puoi anche dividere un file in più file raggruppati in base ai dati della colonna. Ad esempio, se desideri dividere colors.txt in più file in base al colore visualizzato in ciascuna riga, puoi fare in modo che awk reindirizzi per query includendo il reindirizzamento nella tua dichiarazione awk:
$ awk '{print > $2".txt"}' colours.txt
Questo produce file denominati yellow.txt , red.txt , e così via.
Nel prossimo articolo imparerai di più su campi, record e alcune potenti variabili awk.
Questo articolo è adattato da un episodio di Hacker Public Radio, un podcast tecnologico della comunità.