Tracce
/
AWK
AWK
/
Programma
/
Fondamenti
Fo

Fondamenti in AWK

1 esercizio

Informazioni su Fondamenti

Ci riferiremo al linguaggio come AWK e all'eseguibile che interpreta i programmi AWK come awk o gawk.

Pattern e azioni

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.

Record e campi

AWK analizza l'input come una serie di record. Ogni record viene suddiviso in zero o più campi.

Il comportamento predefinito consiste nel:

  • suddividere l'input in record usando la nuova riga come «separatore di record», così ogni riga è un record.
  • suddividere il record in campi usando gli spazi bianchi come «separatore di campo», così ogni parola è un campo.

Pattern e azioni, continuazione

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.

Pattern speciali

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.

Variabili di campo

Ti riferisci ai campi con $1, $2, $3, ecc.

Il record corrente è $0.

Caution

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.

Variabili predefinite che controllano l'analisi dell'input

  • 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.

Variabili predefinite che forniscono informazioni

Queste variabili vengono impostate automaticamente da AWK durante l'esecuzione del programma.

  • NF memorizza il numero di campi nel record corrente.
    • Per ottenere il valore dell'ultimo campo, usa $NF.
  • NR memorizza il numero del record corrente.
    • Quando vengono elaborati più file di input, NR contiene il numero totale di record elaborati finora.
  • FNR memorizza il numero del record corrente all'interno del file di input corrente.
    • Per illustrare la differenza tra NR e FNR, ecco un idioma AWK molto comune.
      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.

Il concetto di verità

AWK usa lo stesso concetto di verità che usa il C:

  • Il numero 0 è falso.
  • Qualsiasi altro numero è vero.

Poiché AWK è un linguaggio per l'elaborazione di testo, i valori di verità si estendono anche alle stringhe.

  • Una stringa vuota "" è falsa.
  • Qualsiasi stringa non vuota è vera.
Note

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.

Caution

Una stranezza a cui fare attenzione

  • Il numero 0 è falso.
  • La stringa non vuota "0" è vera!

Approfondiremo i tipi di dati di AWK nei concetti successivi.

I commenti

I commenti iniziano con il carattere # e si estendono fino alla fine della riga.

Come passare input a 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}'

Esempi

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

Altri esempi

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
    
Modifica tramite GitHub Il collegamento si apre in una nuova finestra o scheda

Impara Fondamenti