Introduzione
Il awk
command è uno strumento Linux e un linguaggio di programmazione che consente agli utenti di elaborare e manipolare dati e produrre report formattati. Lo strumento supporta varie operazioni per l'elaborazione avanzata del testo e facilita l'espressione di selezioni di dati complesse.
In questo tutorial imparerai cosa è il awk
comando fa e come usarlo.
Prerequisiti
- Un sistema che esegue Linux.
- Accesso a una finestra del terminale.
Sintassi del comando AWK
La sintassi per awk
il comando è:
awk [options] 'selection_criteria {action}' input-file > output-file
Le opzioni disponibili sono:
Opzione | Descrizione |
---|---|
-F [separator] | Utilizzato per specificare un separatore di file. Il separatore predefinito è uno spazio vuoto. |
-f [filename] | Utilizzato per specificare il file contenente il awk sceneggiatura. Legge il awk sorgente del programma dal file specificato, invece del primo argomento della riga di comando. |
-v | Utilizzato per assegnare una variabile. |
Come funziona il comando AWK?
Il awk
lo scopo principale del comando è quello di effettuare recupero di informazioni e manipolazione del testo facile da eseguire in Linux. Il comando funziona scansionando un insieme di righe di input nell'ordine e ricerca le righe corrispondenti ai modelli specificati dall'utente.
Per ogni modello, gli utenti possono specificare un'azione da eseguire su ogni riga che corrisponde al modello specificato. Pertanto, utilizzando awk
, gli utenti possono elaborare facilmente file di registro complessi e generare un report leggibile.
Operazioni AWK
awk
consente agli utenti di eseguire varie operazioni su un file o testo di input. Alcune delle operazioni disponibili sono:
- Scansiona un file riga per riga.
- Dividi la riga/il file di input in campi.
- Confronta la riga o i campi di input con i pattern specificati.
- Esegui varie azioni sulle linee abbinate.
- Formatta le righe di output.
- Esegui operazioni aritmetiche e sulle stringhe.
- Utilizza flusso di controllo e loop in uscita.
- Trasforma i file ei dati secondo una struttura specifica.
- Genera rapporti formattati.
Dichiarazioni AWK
Il comando fornisce istruzioni di flusso di controllo di base (if-else
, while
, for
, break
) e consente inoltre agli utenti di raggruppare le istruzioni utilizzando le parentesi graffe {}
.
- se-altro
Il if-else
funziona valutando la condizione specificata tra parentesi e, se la condizione è vera, l'affermazione che segue il if
l'istruzione viene eseguita. Il else
la parte è facoltativa.
Ad esempio:
awk -F ',' '{if($2==$3){print $1","$2","$3} else {print "No Duplicates"}}' answers.txt
L'output mostra le righe in cui esistono duplicati e indica Nessun duplicato se non ci sono risposte duplicate nella riga.
- mentre
Il while
istruzione esegue ripetutamente un'istruzione di destinazione fintanto che la condizione specificata è vera. Ciò significa che funziona come quello del linguaggio di programmazione C. Se la condizione è vera, il corpo del ciclo viene eseguito. Se la condizione è falsa, awk
continua con l'esecuzione.
Ad esempio, la seguente istruzione indica awk
per stampare tutti i campi di input uno per riga:
awk '{i=0; while(i<=NF) { print i ":"$i; i++;}}' employees.txt
- per
Il for
funziona anche come quella di C, consentendo agli utenti di creare un ciclo che deve essere eseguito un numero specifico di volte.
Ad esempio:
awk 'BEGIN{for(i=1; i<=10; i++) print "The square of", i, "is", i*i;}'
L'istruzione sopra aumenta il valore di i
di uno fino a raggiungere dieci e calcola il quadrato di i
ogni volta.
- pausa
La break
l'istruzione esce immediatamente da un while
che lo racchiude o for
. Per iniziare l'iterazione successiva, usa il continue
dichiarazione.
Il next
l'istruzione indica awk
per passare al record successivo e iniziare la scansione dei modelli dall'alto. L'exit
l'istruzione indica awk
che l'input è terminato.
Di seguito è riportato un esempio di break
dichiarazione:
awk 'BEGIN{x=1; while(1) {print "Example"; if ( x==5 ) break; x++; }}'
Il comando sopra interrompe il ciclo dopo 5 iterazioni.
Modelli AWK
Inserimento di un pattern davanti a un'azione in awk
funge da selettore . Il selettore determina se eseguire o meno un'azione. Le seguenti espressioni possono fungere da pattern:
- Espressioni regolari.
- Espressioni relazionali aritmetiche.
- Espressioni con valori di stringa.
- Combinazioni booleane arbitrarie delle espressioni precedenti.
Le sezioni seguenti spiegano le espressioni sopra menzionate e come usarle.
Modelli di espressione regolari
I modelli di espressioni regolari sono la forma più semplice di espressioni contenenti una stringa di caratteri racchiusa tra barre. Può essere una sequenza di lettere, numeri o una combinazione di entrambi.
Nell'esempio seguente, il programma emette tutte le righe che iniziano con "A". Se la stringa specificata fa parte di una parola più grande, viene stampata anche.
awk '$1 ~ /^A/ {print $0}' employees.txt
Modelli di espressione relazionale
Un altro tipo di awk
i modelli sono modelli di espressione relazionale. I modelli di espressione relazionale implicano l'utilizzo di uno qualsiasi dei seguenti operatori relazionali:<, <=, ==, !=,>= e > .
Di seguito è riportato un esempio di awk
espressione relazionale:
awk 'BEGIN { a = 10; b = 10; if (a == b) print "a == b" }'
Modelli di portata
Un pattern di intervallo è un pattern composto da due pattern separati da una virgola. I modelli di intervallo eseguono l'azione specificata per ciascuna riga tra l'occorrenza del modello uno e il modello due.
Ad esempio:
awk '/clerk/, /manager/ {print $1, $2}' employees.txt
Il modello sopra indica awk
per stampare tutte le righe dell'input contenenti le parole chiave "impiegato" e "manager".
Modelli di espressioni speciali
I modelli di espressioni speciali includono BEGIN
e END
che denotano l'inizializzazione e la fine del programma. Il BEGIN
pattern corrisponde all'inizio dell'input, prima che il primo record venga elaborato. Il END
il modello corrisponde alla fine dell'input, dopo che l'ultimo record è stato elaborato.
Ad esempio, puoi istruire awk
per visualizzare un messaggio all'inizio e alla fine del processo:
awk 'BEGIN { print "List of debtors:" }; {print $1, $2}; END {print "End of the debtor list"}' debtors.txt
Combinazione di motivi
Il awk
comando consente agli utenti di combinare due o più modelli utilizzando operatori logici. I modelli combinati possono essere qualsiasi combinazione booleana di modelli. Gli operatori logici per combinare i modelli sono:
||
(o)&&
(e)!
(non)
Ad esempio:
awk '$3 > 10 && $4 < 20 {print $1, $2}' employees.txt
L'output stampa il primo e il secondo campo di quei record il cui terzo campo è maggiore di dieci e il quarto campo è minore di 20.
Variabili AWK
Il awk
comando ha variabili di campo integrate, che suddividono il file di input in parti separate chiamate campi . Il awk
assegna le seguenti variabili a ciascun campo dati:
$0
. Utilizzato per specificare l'intera riga.$1
. Specifica il primo campo.$2
. Specifica il secondo campo.- ecc.
Altri awk
integrati disponibili le variabili sono:
NR
. Conta il numero di record di input (solitamente righe). Ilawk
comando esegue le istruzioni modello/azione una volta per ogni record in un file.
Ad esempio:
awk '{print NR,$0}' employees.txt
Il comando visualizza il numero di riga nell'output.
NF
. Conta il numero di campi nel record di input corrente e visualizza l'ultimo campo del file.
Ad esempio:
awk '{print $NF}' employees.txt
FS
. Contiene il carattere utilizzato per dividere i campi nella riga di input. Il separatore predefinito è lo spazio, ma puoi utilizzareFS
per riassegnare il separatore a un altro carattere (in genere inBEGIN
).
Ad esempio, puoi creare etc/passwd file (elenco utenti) più leggibile cambiando il separatore da due punti (:
) in un trattino (/
) e stampare anche il separatore di campo:
awk -FS 'BEGIN{FS=":"; OFS="-"} {print $0}' /etc/passwd
RS
. Memorizza il carattere separatore del record corrente. La riga di input predefinita è il record di input, che rende una nuova riga il separatore di record predefinito. Il comando è utile se l'input è un file separato da virgole (CSV).
Ad esempio:
awk 'BEGIN {FS="-"; RS=","; OFS=" owes Rs. "} {print $1,$2}' debtors.txt
OFS
. Memorizza il separatore del campo di output, che separa i campi durante la stampa. Il separatore predefinito è uno spazio vuoto. Ogni volta che il file stampato ha diversi parametri separati da virgole, ilOFS
il valore viene stampato tra ogni parametro.
Ad esempio:
awk 'OFS=" works as " {print $1,$3}' employees.txt
Azioni AWK
Il awk
lo strumento segue le regole che contengono coppie modello-azione. Le azioni consistono in istruzioni racchiuse tra parentesi graffe {}
che contengono espressioni, istruzioni di controllo, istruzioni composte, istruzioni di input e output e istruzioni di eliminazione. Tali affermazioni sono descritte nelle sezioni precedenti.
Crea un awk
script utilizzando la seguente sintassi:
awk '{action}'
Ad esempio:
awk '{print "How to use the awk command"}'
Questo semplice comando indica awk
per stampare la stringa specificata ogni volta che si esegue il comando. Termina il programma usando Ctrl+D .
Come utilizzare il comando AWK - Esempi
Oltre a manipolare i dati e produrre output formattati, awk
ha altri usi in quanto è un linguaggio di scripting e non solo un comando di elaborazione del testo. Questa sezione spiega casi d'uso alternativi per awk
.
- Calcoli . Il
awk
comando consente di eseguire calcoli aritmetici. Ad esempio:
df | awk '/\/dev\/loop/ {print $1"\t"$2 + $3}'
In questo esempio, eseguiamo il pipe nel comando df e utilizziamo le informazioni generate nel report per calcolare la memoria totale disponibile e utilizzata dai filesystem montati che contengono solo /dev e /loop nel nome.
Il report prodotto mostra la somma della memoria di /dev e /loop filesystem nelle colonne due e tre del df
uscita.
- Filtraggio . Il
awk
Il comando consente di filtrare l'output limitando la lunghezza delle righe. Ad esempio:
awk 'length($0) > 8' /etc/shells
In questo esempio, abbiamo eseguito /etc/shells file di sistema tramite awk
e filtrato l'output per contenere solo le righe contenenti più di 8 caratteri.
- Monitoraggio . Controlla se un determinato processo è in esecuzione in Linux collegando il
ps
comando. Ad esempio:
ps -ef | awk '{ if($NF == "clipboard") print $0}'
L'output stampa un elenco di tutti i processi in esecuzione sulla macchina con l'ultimo campo che corrisponde al modello specificato.
- Conteggio . Puoi usare
awk
per contare il numero di caratteri in una riga e ottenere il numero stampato nel risultato. Ad esempio:
awk '{ print "The number of characters in line", NR,"=" length($0) }' employees.txt