GNU/Linux >> Linux Esercitazione >  >> Linux

Una guida pratica per imparare awk

Di tutti i comandi Linux disponibili (e ce ne sono molti), i tre più per eccellenza sembrano essere sed , awk e grep . Forse è il suono arcano dei loro nomi, o l'ampiezza del loro potenziale utilizzo, o solo la loro età, ma quando qualcuno dà un esempio di un comando "Linuxy", di solito è uno di quei tre. E mentre sed e grep hanno diversi standard semplici di una riga, il meno prestigioso awk rimane costantemente prominente per essere particolarmente sconcertante.

Probabilmente utilizzerai sed per una rapida sostituzione della stringa o grep per filtrare un pattern su base giornaliera. È molto meno probabile che tu scriva un awk comando. Mi chiedo spesso perché questo sia, e lo attribuisco ad alcune cose. Prima di tutto, molti di noi usano a malapena sed e grep per tutt'altro che qualche variazione su questi due comandi:

$ sed -e 's/foo/bar/g' file.txt
$ grep foo file.txt

Più risorse Linux

  • Comandi Linux cheat sheet
  • Cheat sheet sui comandi avanzati di Linux
  • Corso online gratuito:Panoramica tecnica RHEL
  • Cheat sheet della rete Linux
  • Cheat sheet di SELinux
  • Cheat sheet dei comandi comuni di Linux
  • Cosa sono i container Linux?
  • I nostri ultimi articoli su Linux

Quindi, anche se potresti sentirti più a tuo agio con sed e grep , potresti non utilizzare tutto il loro potenziale. Naturalmente, non c'è alcun obbligo di saperne di più su sed o grep , ma a volte mi chiedo come "imparo" i comandi. Invece di imparare come un comando funziona, spesso imparo un incantesimo specifico che include un comando. Di conseguenza, sento spesso una falsa familiarità con il comando. Penso di conoscere un comando perché posso nominare tre o quattro opzioni in cima alla mia testa, anche se non so cosa fanno le opzioni e non riesco a capire bene la sintassi.

E questo è il problema, credo, che molte persone devono affrontare quando si confrontano con la potenza e la flessibilità di awk .

Imparare awk a usare awk

Le basi di awk sono sorprendentemente semplici. Si nota spesso che awk è un linguaggio di programmazione e, sebbene sia relativamente semplice, è vero. Ciò significa che puoi imparare awk allo stesso modo in cui impari un nuovo linguaggio di programmazione:impara la sua sintassi usando alcuni comandi di base, impara il suo vocabolario in modo da poter costruire azioni complesse e poi esercitati, esercitati, esercitati.

Come awk analizza l'input

Awk vede l'input, essenzialmente, come un array. Quando awk esegue la scansione di un file di testo, tratta ogni riga, singolarmente e in successione, come un record . Ogni record è suddiviso in campi . Naturalmente, awk deve tenere traccia di queste informazioni e puoi vedere quei dati usando il NR (numero di record) e NF (numero di campi) variabili integrate. Ad esempio, questo ti dà il conteggio delle righe di un file:

$ awk 'END { print NR;}' example.txt
36

Questo rivela anche qualcosa su awk sintassi. Sia che tu stia scrivendo awk come one-liner o come script autonomo, la struttura di un awk l'istruzione è:

pattern or keyword { actions }

In questo esempio, la parola END è una parola chiave speciale e riservata piuttosto che un pattern. Una parola chiave simile è BEGIN . Con entrambe queste parole chiave, awk esegue semplicemente l'azione tra parentesi graffe all'inizio o alla fine dell'analisi dei dati.

Puoi utilizzare un modello come filtro o qualificatore in modo che awk esegue una determinata azione solo quando è in grado di far corrispondere il tuo modello al record corrente. Ad esempio, supponi di voler utilizzare awk , proprio come faresti con grep , per trovare la parola Linux in un file di testo:

$ awk '/Linux/ { print $0; }' os.txt
OS: CentOS Linux (10.1.1.8)
OS: CentOS Linux (10.1.1.9)
OS: Red Hat Enterprise Linux (RHEL) (10.1.1.11)
OS: Elementary Linux (10.1.2.4)
OS: Elementary Linux (10.1.2.5)
OS: Elementary Linux (10.1.2.6)

Per awk , ogni riga nel file è un record e ogni parola in un record è un campo. Per impostazione predefinita, i campi sono separati da uno spazio. Puoi cambiarlo con il --field-separator opzione, che imposta il FS (separatore di campo) variabile in qualsiasi cosa tu voglia che sia:

$ awk --field-separator ':' '/Linux/ { print $2; }' os.txt 
 CentOS Linux (10.1.1.8)
 CentOS Linux (10.1.1.9)
 Red Hat Enterprise Linux (RHEL) (10.1.1.11)
 Elementary Linux (10.1.2.4)
 Elementary Linux (10.1.2.5)
 Elementary Linux (10.1.2.6)

In questo esempio, c'è uno spazio vuoto prima di ogni inserzione perché c'è uno spazio vuoto dopo ogni due punti (: ) nel testo di partenza. Questo non è cut , tuttavia, quindi il separatore di campo non deve essere limitato a un carattere:

$ awk --field-separator ': ' '/Linux/ { print $2; }' os.txt 
CentOS Linux (10.1.1.8)
CentOS Linux (10.1.1.9)
Red Hat Enterprise Linux (RHEL) (10.1.1.11)
Elementary Linux (10.1.2.4)
Elementary Linux (10.1.2.5)
Elementary Linux (10.1.2.6)

Funzioni in awk

Puoi creare le tue funzioni in awk usando questa sintassi:

name(parameters) { actions }

Le funzioni sono importanti perché ti consentono di scrivere il codice una volta e di riutilizzarlo durante il tuo lavoro. Quando si costruiscono battute, le funzioni personalizzate sono un po' meno utili di quanto non lo siano negli script, ma awk definisce già molte funzioni per te. Funzionano praticamente allo stesso modo di qualsiasi funzione in qualsiasi altra lingua o foglio di calcolo:impari l'ordine in cui la funzione ha bisogno di informazioni da te e puoi darle da mangiare qualunque cosa tu voglia per ottenere i risultati.

Ci sono funzioni per eseguire operazioni matematiche ed elaborazione di stringhe. Quelli di matematica sono spesso abbastanza semplici. Fornisci un numero e lo scricchiola:

$ awk 'BEGIN { print sqrt(1764); }'
42

Le funzioni delle stringhe possono essere più complesse ma sono ben documentate nel manuale awk di GNU. Ad esempio, il split la funzione accetta un'entità che awk visualizza come un unico campo e lo divide in parti diverse. Richiede un campo, una variabile da utilizzare come matrice contenente ciascuna parte della divisione e il carattere che desideri utilizzare come delimitatore.

Utilizzando l'output degli esempi precedenti, so che c'è un indirizzo IP alla fine di ogni record. In questo caso, posso inviare solo l'ultimo campo di un record allo split funzione facendo riferimento alla variabile NF perché contiene il numero di campi (e il campo finale deve essere il numero più alto):

$ awk --field-separator ': ' '/Linux/ { split($NF, IP, "."); print "subnet: " IP[3]; }' os.txt
subnet: 1
subnet: 1
subnet: 1
subnet: 2
subnet: 2
subnet: 2

Ci sono molte più funzioni e non c'è motivo di limitarsi a una per blocco di awk codice. Puoi costruire pipeline complesse con awk nel tuo terminale, oppure puoi scrivere awk script per definire e utilizzare le proprie funzioni.

Scarica l'eBook

Imparare awk è principalmente una questione di usare awk . Usalo anche se significa duplicare le funzionalità che hai già con sed o grep o cut o tr o qualsiasi altro comando perfettamente valido. Una volta che ti senti a tuo agio con esso, puoi scrivere funzioni Bash che invocano il tuo awk personalizzato comandi per un più facile utilizzo. E alla fine, sarai in grado di scrivere script per analizzare set di dati complessi.

Scarica il nostro eBook  per imparare tutto ciò che devi sapere su awk e inizia a usarlo oggi.


Linux
  1. Una guida all'installazione di applicazioni su Linux

  2. Imparare ad amare systemd

  3. Una guida per principianti al firewalld in Linux

  4. Una guida per principianti a gawk

  5. I miei 8 comandi Linux pratici preferiti

Guida completa alla registrazione di Linux

16 Esempi pratici di comando traceroute in Linux

20 esempi pratici di comando Chown in Linux

12 Esempi pratici di In Command in Linux

40 Comando awk pratico e utile in Linux e BSD

Una guida pratica per il comando chroot in Linux