Di tutti i comandi Linux disponibili (e ce ne sono molti), i tre più per eccellenza sembrano essere sed
, awk
e grep
. Forse è il suono arcano dei loro nomi, o l'ampiezza del loro potenziale utilizzo, o solo la loro età, ma quando qualcuno dà un esempio di un comando "Linuxy", di solito è uno di quei tre. E mentre sed
e grep
hanno diversi standard semplici di una riga, il meno prestigioso awk
rimane costantemente prominente per essere particolarmente sconcertante.
Probabilmente utilizzerai sed
per una rapida sostituzione della stringa o grep
per filtrare un pattern su base giornaliera. È molto meno probabile che tu scriva un awk
comando. Mi chiedo spesso perché questo sia, e lo attribuisco ad alcune cose. Prima di tutto, molti di noi usano a malapena sed
e grep
per tutt'altro che qualche variazione su questi due comandi:
$ sed -e 's/foo/bar/g' file.txt
$ grep foo file.txt
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
Quindi, anche se potresti sentirti più a tuo agio con sed
e grep
, potresti non utilizzare tutto il loro potenziale. Naturalmente, non c'è alcun obbligo di saperne di più su sed
o grep
, ma a volte mi chiedo come "imparo" i comandi. Invece di imparare come un comando funziona, spesso imparo un incantesimo specifico che include un comando. Di conseguenza, sento spesso una falsa familiarità con il comando. Penso di conoscere un comando perché posso nominare tre o quattro opzioni in cima alla mia testa, anche se non so cosa fanno le opzioni e non riesco a capire bene la sintassi.
E questo è il problema, credo, che molte persone devono affrontare quando si confrontano con la potenza e la flessibilità di awk
.
Imparare awk a usare awk
Le basi di awk
sono sorprendentemente semplici. Si nota spesso che awk
è un linguaggio di programmazione e, sebbene sia relativamente semplice, è vero. Ciò significa che puoi imparare awk
allo stesso modo in cui impari un nuovo linguaggio di programmazione:impara la sua sintassi usando alcuni comandi di base, impara il suo vocabolario in modo da poter costruire azioni complesse e poi esercitati, esercitati, esercitati.
Come awk analizza l'input
Awk
vede l'input, essenzialmente, come un array. Quando awk
esegue la scansione di un file di testo, tratta ogni riga, singolarmente e in successione, come un record . Ogni record è suddiviso in campi . Naturalmente, awk
deve tenere traccia di queste informazioni e puoi vedere quei dati usando il NR
(numero di record) e NF
(numero di campi) variabili integrate. Ad esempio, questo ti dà il conteggio delle righe di un file:
$ awk 'END { print NR;}' example.txt
36
Questo rivela anche qualcosa su awk
sintassi. Sia che tu stia scrivendo awk
come one-liner o come script autonomo, la struttura di un awk
l'istruzione è:
pattern or keyword { actions }
In questo esempio, la parola END
è una parola chiave speciale e riservata piuttosto che un pattern. Una parola chiave simile è BEGIN
. Con entrambe queste parole chiave, awk
esegue semplicemente l'azione tra parentesi graffe all'inizio o alla fine dell'analisi dei dati.
Puoi utilizzare un modello come filtro o qualificatore in modo che awk
esegue una determinata azione solo quando è in grado di far corrispondere il tuo modello al record corrente. Ad esempio, supponi di voler utilizzare awk
, proprio come faresti con grep
, per trovare la parola Linux in un file di testo:
$ awk '/Linux/ { print $0; }' os.txt
OS: CentOS Linux (10.1.1.8)
OS: CentOS Linux (10.1.1.9)
OS: Red Hat Enterprise Linux (RHEL) (10.1.1.11)
OS: Elementary Linux (10.1.2.4)
OS: Elementary Linux (10.1.2.5)
OS: Elementary Linux (10.1.2.6)
Per awk
, ogni riga nel file è un record e ogni parola in un record è un campo. Per impostazione predefinita, i campi sono separati da uno spazio. Puoi cambiarlo con il --field-separator
opzione, che imposta il FS
(separatore di campo) variabile in qualsiasi cosa tu voglia che sia:
$ awk --field-separator ':' '/Linux/ { print $2; }' os.txt
CentOS Linux (10.1.1.8)
CentOS Linux (10.1.1.9)
Red Hat Enterprise Linux (RHEL) (10.1.1.11)
Elementary Linux (10.1.2.4)
Elementary Linux (10.1.2.5)
Elementary Linux (10.1.2.6)
In questo esempio, c'è uno spazio vuoto prima di ogni inserzione perché c'è uno spazio vuoto dopo ogni due punti (:
) nel testo di partenza. Questo non è cut
, tuttavia, quindi il separatore di campo non deve essere limitato a un carattere:
$ awk --field-separator ': ' '/Linux/ { print $2; }' os.txt
CentOS Linux (10.1.1.8)
CentOS Linux (10.1.1.9)
Red Hat Enterprise Linux (RHEL) (10.1.1.11)
Elementary Linux (10.1.2.4)
Elementary Linux (10.1.2.5)
Elementary Linux (10.1.2.6)
Funzioni in awk
Puoi creare le tue funzioni in awk
usando questa sintassi:
name(parameters) { actions }
Le funzioni sono importanti perché ti consentono di scrivere il codice una volta e di riutilizzarlo durante il tuo lavoro. Quando si costruiscono battute, le funzioni personalizzate sono un po' meno utili di quanto non lo siano negli script, ma awk
definisce già molte funzioni per te. Funzionano praticamente allo stesso modo di qualsiasi funzione in qualsiasi altra lingua o foglio di calcolo:impari l'ordine in cui la funzione ha bisogno di informazioni da te e puoi darle da mangiare qualunque cosa tu voglia per ottenere i risultati.
Ci sono funzioni per eseguire operazioni matematiche ed elaborazione di stringhe. Quelli di matematica sono spesso abbastanza semplici. Fornisci un numero e lo scricchiola:
$ awk 'BEGIN { print sqrt(1764); }'
42
Le funzioni delle stringhe possono essere più complesse ma sono ben documentate nel manuale awk di GNU. Ad esempio, il split
la funzione accetta un'entità che awk
visualizza come un unico campo e lo divide in parti diverse. Richiede un campo, una variabile da utilizzare come matrice contenente ciascuna parte della divisione e il carattere che desideri utilizzare come delimitatore.
Utilizzando l'output degli esempi precedenti, so che c'è un indirizzo IP alla fine di ogni record. In questo caso, posso inviare solo l'ultimo campo di un record allo split
funzione facendo riferimento alla variabile NF
perché contiene il numero di campi (e il campo finale deve essere il numero più alto):
$ awk --field-separator ': ' '/Linux/ { split($NF, IP, "."); print "subnet: " IP[3]; }' os.txt
subnet: 1
subnet: 1
subnet: 1
subnet: 2
subnet: 2
subnet: 2
Ci sono molte più funzioni e non c'è motivo di limitarsi a una per blocco di awk
codice. Puoi costruire pipeline complesse con awk
nel tuo terminale, oppure puoi scrivere awk
script per definire e utilizzare le proprie funzioni.
Scarica l'eBook
Imparare awk
è principalmente una questione di usare awk
. Usalo anche se significa duplicare le funzionalità che hai già con sed
o grep
o cut
o tr
o qualsiasi altro comando perfettamente valido. Una volta che ti senti a tuo agio con esso, puoi scrivere funzioni Bash che invocano il tuo awk
personalizzato comandi per un più facile utilizzo. E alla fine, sarai in grado di scrivere script per analizzare set di dati complessi.
Scarica il nostro eBook per imparare tutto ciò che devi sapere su awk
e inizia a usarlo oggi.