Basi
Eseguire AWK
awk '{ print }' file.txt # stampa ogni riga awk '{ print $1 }' file.txt # stampa primo campo awk -F: '{ print $1 }' /etc/passwd # delimitatore personalizzato awk -f script.awk file.txt # esegui da file cmd | awk '{ print $2 }' # input da pipe
Struttura del Programma
awk 'pattern { action }'Forma base — l'azione viene eseguita quando il pattern corrisponde
BEGIN { ... }Eseguito una volta prima di elaborare l'input
END { ... }Eseguito una volta dopo tutto l'input
Nessun patternL'azione viene eseguita per ogni riga
Nessuna azioneL'azione predefinita è { print }
Pattern e Azioni
Tipi di Pattern
awk '/error/' file.txt # corrispondenza regex awk '$3 > 100' file.txt # confronto awk 'NR >= 5 && NR <= 10' file.txt # intervallo di righe awk '/start/,/end/' file.txt # pattern intervallo
Riferimento Pattern
/regex/Confronta la riga con regex
$1 ~ /pat/Il campo corrisponde alla regex
$1 !~ /pat/Il campo non corrisponde alla regex
expr1, expr2Intervallo: dalla prima alla seconda corrispondenza
expr1 && expr2AND logico
expr1 || expr2OR logico
!exprNOT logico
Variabili
Variabili Predefinite
NRNumero del record (riga) corrente
NFNumero di campi nel record corrente
FSSeparatore di campo input (predefinito: spazio bianco)
OFSSeparatore di campo output (predefinito: spazio)
RSSeparatore di record input (predefinito: newline)
ORSSeparatore di record output (predefinito: newline)
FILENAMENome del file di input corrente
FNRNumero del record nel file corrente
Variabili Utente
awk '{ total += $1 } END { print total }' file.txt awk -v threshold=50 '$1 > threshold' file.txt awk 'BEGIN { count = 0 } /pat/ { count++ } END { print count }' file.txt
Campi
Accesso ai Campi
$0Intera riga corrente
$1, $2, ...Primo, secondo, ... campo
$NFUltimo campo
$(NF-1)Penultimo campo
Separatori di Campo
awk -F, '{ print $2 }' data.csv # virgola awk -F'\t' '{ print $1 }' data.tsv # tab awk 'BEGIN { FS = "[,:]" } { print $1 }' f # multi-char awk 'BEGIN { OFS = "," } { print $1, $3 }' f # sep output
Controllo del Flusso
Condizioni e Cicli
awk '{ if ($1 > 50) print "high"; else print "low" }' f awk '{ for (i = 1; i <= NF; i++) print $i }' f awk '{ i = 1; while (i <= NF) { print $i; i++ } }' f awk '/skip/ { next } { print }' f # salta righe corrispondenti
Istruzioni di Controllo
if (cond) { ... } else { ... }Condizionale
for (i = 0; i < n; i++) { ... }Ciclo for in stile C
for (key in array) { ... }Itera sulle chiavi dell'array
while (cond) { ... }Ciclo while
do { ... } while (cond)Ciclo do-while
nextSalta al record di input successivo
exitFerma elaborazione, esegui blocco END
Funzioni
Funzioni Definite dall'Utente
awk 'function max(a, b) { return (a > b) ? a : b } { print max($1, $2) }' file.txt
Funzioni Numeriche
int(x)Tronca a intero
sqrt(x)Radice quadrata
sin(x), cos(x)Funzioni trigonometriche
log(x), exp(x)Logaritmo naturale ed esponenziale
rand()Numero float casuale tra 0 e 1
srand(seed)Imposta il seme del generatore casuale
Array
Array Associativi
awk '{ count[$1]++ } END { for (k in count) print k, count[k] }' f awk '{ arr[NR] = $0 } END { for (i = NR; i >= 1; i--) print arr[i] }' f
Operazioni sugli Array
arr[key] = valImposta elemento
arr[key]Ottieni elemento (creato automaticamente all'accesso)
key in arrVerifica se la chiave esiste
delete arr[key]Elimina singolo elemento
delete arrElimina l'intero array
for (k in arr)Itera sulle chiavi (non ordinato)
length(arr)Numero di elementi (gawk)
Funzioni Stringa
Riferimento Stringhe
length(s)Lunghezza stringa
substr(s, start, len)Sottostringa (indicizzata da 1)
index(s, target)Posizione di target in s (0 se non trovato)
split(s, arr, sep)Divide la stringa in array
sub(pat, repl, s)Sostituisce la prima corrispondenza
gsub(pat, repl, s)Sostituisce tutte le corrispondenze
match(s, pat)Posizione della corrispondenza regex (imposta RSTART, RLENGTH)
tolower(s) / toupper(s)Conversione maiuscolo/minuscolo
sprintf(fmt, ...)Formatta stringa (come printf in C)
Esempi Stringa
awk '{ gsub(/old/, "new"); print }' f # sostituzione simile a sed awk '{ print toupper($0) }' f # tutto maiuscolo awk '{ print substr($0, 1, 40) }' f # tronca a 40
I/O
Output
awk '{ print $1, $2 }' f # separato da spazio awk '{ printf "%s,%d\n", $1, $2 }' f # output formattato awk '{ print $1 > "out.txt" }' f # reindirizza su file awk '{ print $1 >> "out.txt" }' f # accoda su file
Riferimento I/O
printStampa con ORS (newline predefinito)
printf fmt, ...Stampa formattata (senza newline finale)
print > fileReindirizza output su file
print >> fileAccoda output su file
print | cmdInvia output a un comando via pipe
getline < fileLegge una riga da file
cmd | getline varLegge output di un comando nella variabile
close(file)Chiude file o pipe
Pattern Comuni
One-Liner
awk '{ sum += $1 } END { print sum }' f # somma colonna awk 'END { print NR }' f # conta righe awk '!seen[$0]++' f # rimuovi duplicati awk 'NF' f # rimuovi righe vuote awk '{ print NF }' f # campi per riga
Ricette
CSV a TSVawk -F, 'BEGIN{OFS="\t"} {$1=$1; print}'
Somma colonna 2awk '{ s += $2 } END { print s }'
Prime N righeawk 'NR <= 10' (come head)
Conteggio frequenzaawk '{ c[$1]++ } END { for (k in c) print k, c[k] }'
Tra marcatoriawk '/BEGIN/,/END/'
Stampa campo Nawk '{ print $N }' (sostituire N)