Ci riferiremo al linguaggio come AWK e all'eseguibile che interpreta i programmi AWK come awk o gawk.
Un programma AWK è composto da coppie pattern-azione
pattern1 { action1 }
pattern2 { action2 }
...
Un pattern può essere un'espressione regolare con cui confrontare l'input. Può anche essere qualsiasi espressione che restituisce un valore vero/falso.
Un'azione è uno o più comandi AWK. Le parentesi graffe che la racchiudono sono obbligatorie.
Se il risultato del pattern è vero, viene valutata l'azione corrispondente.
AWK analizza l'input come una serie di record. Ogni record viene suddiviso in zero o più campi.
Il comportamento predefinito consiste nel:
Il pattern può essere omesso; in questo caso l'azione viene valutata per ogni record di input.
L'azione può essere omessa; in questo caso l'azione predefinita consiste nello stampare il record corrente.
Ci sono due pattern speciali che vengono usati spesso.
BEGIN valuta l'azione associata prima che venga consumato qualsiasi input.END valuta l'azione associata dopo che tutto l'input è stato consumato.Ti riferisci ai campi con $1, $2, $3, ecc.
Il record corrente è $0.
Per essere chiari, queste non sono propriamente «variabili».
Il $ può essere considerato un operatore che ottiene il valore del numero di campo indicato.
Approfondiremo questo aspetto nei concetti successivi.
Ecco altre variabili predefinite usate di frequente.
RS è il separatore di record dell'input.
Come accennato, il suo valore predefinito è una nuova riga.FS è il separatore di campo dell'input.Queste variabili vengono spesso impostate nel blocco di azione BEGIN.
Queste variabili vengono impostate automaticamente da AWK durante l'esecuzione del programma.
NF memorizza il numero di campi nel record corrente.
$NF.NR memorizza il numero del record corrente.
NR contiene il numero totale di record elaborati finora.FNR memorizza il numero del record corrente all'interno del file di input corrente.
NR == FNR {action}
Significa «se il numero di record accumulato è uguale al numero di record del file corrente».
Questo può essere vero solo per i record del primo file di input.AWK usa lo stesso concetto di verità che usa il C:
0 è falso.Poiché AWK è un linguaggio per l'elaborazione di testo, i valori di verità si estendono anche alle stringhe.
"" è falsa.AWK usa lo stesso concetto di verità che usa il C
AWK è nato ai Bell Labs negli anni '70, nello stesso ambiente in cui è stato inventato il C. Il C ha influenzato notevolmente la sintassi di AWK.
Una stranezza a cui fare attenzione
0 è falso."0" è vera!Approfondiremo i tipi di dati di AWK nei concetti successivi.
I commenti iniziano con il carattere # e si estendono fino alla fine della riga.
awk
awk può leggere l'input da file o dallo standard input.
Ognuna di queste tecniche funziona.
awk '/regex/ {print $1}' file1 file2 ...
awk '/regex/ {print $1}' < file
some_command_here | awk '/regex/ {print $1}'
Sui sistemi di tipo Unix /etc/passwd contiene informazioni sugli utenti.
Ogni utente è descritto su una riga separata, con i campi separati dai due punti.
Per elencare i nomi utente:
awk '
BEGIN { FS = ":" }
{ print $1 }
' /etc/passwd
Nota che l'azione {print $1} non ha un pattern, quindi viene eseguita per ogni record.
Se vogliamo limitare l'output ai soli utenti che usano bash come shell di login, possiamo fare così:
awk '
BEGIN { FS = ":" }
$7 == "/bin/bash" { print $1 }
' /etc/passwd
Ecco alcuni programmi awk che producono gli stessi risultati di altri comuni comandi Unix.
Visualizzare un file
cat file.txt
awk '1' file.txt
Cercare dei pattern in un file
grep 'foo.*bar' file.txt
awk '/foo.*bar/' file.txt
Visualizzare solo alcune righe all'inizio di un file
head -n 20 file.txt
awk '
1
NR == 20 {exit}
' file.txt
Sostituire del testo in un file
sed 's/foo/bar/' file.txt
awk '{sub(/foo/, "bar")};1' file.txt
# or more readably
awk '
{
sub(/foo/, "bar")
print
}
' file.txt