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). Ilawkcomando 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 utilizzareFSper 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, ilOFSil 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
awkcomando 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
awkIl 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
pscomando. 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
awkper 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