Ricerca nel sito web

Scopri come utilizzare i modelli speciali Awk "BEGIN e END" - Parte 9


Nella Parte 8 di questa serie Awk, abbiamo introdotto alcune potenti funzionalità dei comandi Awk, ovvero variabili, espressioni numeriche e operatori di assegnazione.

Man mano che avanziamo, in questo segmento, tratteremo più funzionalità di Awk, ovvero i modelli speciali: BEGIN e END.

Queste funzionalità speciali si riveleranno utili mentre cerchiamo di espandere ed esplorare più metodi per costruire operazioni Awk complesse.

Per iniziare, riportiamo i nostri pensieri all'introduzione della serie Awk, ricordiamo che quando abbiamo iniziato questa serie, ho sottolineato che la sintassi generale di eseguire un Awk il comando è:

awk 'script' filenames  

E nella sintassi sopra, lo script Awk ha la forma:

/pattern/ { actions } 

Quando consideri il pattern nello script, normalmente è un'espressione regolare, inoltre puoi anche pensare al pattern come pattern speciali BEGIN e END. Pertanto possiamo anche scrivere un comando Awk nella forma seguente:

awk '
 	BEGIN { actions } 
 	/pattern/ { actions }
 	/pattern/ { actions }
            ……….
	 END { actions } 
' filenames  

Nel caso in cui utilizzi i modelli speciali: BEGIN e END in uno script Awk, questo è il significato di ciascuno di essi:

  1. BEGIN pattern: significa che Awk eseguirà le azioni specificate in BEGIN una volta prima che venga letta qualsiasi riga di input.
  2. Modello END: significa che Awk eseguirà le azioni specificate in END prima di uscire effettivamente.

E il flusso di esecuzione di uno script di comandi Awk che contiene questi modelli speciali è il seguente:

  1. Quando il modello BEGIN viene utilizzato in uno script, tutte le azioni per BEGIN vengono eseguite una volta prima che venga letta qualsiasi riga di input.
  2. Quindi una riga di input viene letta e analizzata nei diversi campi.
  3. Successivamente, ciascuno dei modelli non speciali specificati viene confrontato con la riga di input per una corrispondenza, quando viene trovata una corrispondenza, vengono quindi eseguite le azioni per quel modello. Questa fase verrà ripetuta per tutti i modelli specificati.
  4. Successivamente, le fasi 2 e 3 vengono ripetute per tutte le linee di input.
  5. Quando tutte le righe di input sono state lette e gestite, nel caso in cui specifichi il modello END, le azioni verranno eseguite.

Dovresti sempre ricordare questa sequenza di esecuzione quando lavori con i pattern speciali per ottenere i migliori risultati in un'operazione Awk.

Per comprendere tutto, illustriamo utilizzando l'esempio della parte 8, relativo all'elenco dei domini di proprietà di Tecmint, come archiviato in un file denominato domains.txt.

news.linux-console.net
linux-console.net
linuxsay.com
windows.linux-console.net
linux-console.net
news.linux-console.net
linux-console.net
linuxsay.com
linux-console.net
news.linux-console.net
linux-console.net
linuxsay.com
windows.linux-console.net
linux-console.net
cat ~/domains.txt

In questo esempio, vogliamo contare il numero di volte in cui il dominio linux-console.net è elencato nel file domains.txt. Quindi abbiamo scritto un piccolo script di shell per aiutarci a farlo utilizzando l'idea di variabili, espressioni numeriche e operatori di assegnazione che ha il seguente contenuto:

#!/bin/bash
for file in $@; do
        if [ -f $file ] ; then
                #print out filename
                echo "File is: $file"
                #print a number incrementally for every line containing linux-console.net 
                awk '/^linux-console.net/ { counter+=1 ; printf "%s\n", counter ; }' $file
        else
                #print error info incase input is not a file
                echo "$file is not a file, please specify a file." >&2 && exit 1
        fi
done
#terminate script with exit code 0 in case of successful execution 
exit 0

Utilizziamo ora i due modelli speciali: BEGIN e END nel comando Awk nello script sopra come segue:

Modificheremo lo script:

awk '/^linux-console.net/ { counter+=1 ; printf "%s\n", counter ; }' $file

A :

awk ' BEGIN {  print "The number of times linux-console.net appears in the file is:" ; }
                      /^linux-console.net/ {  counter+=1  ;  }
                      END {  printf "%s\n",  counter  ; } 
                    '  $file

Dopo aver apportato le modifiche al comando Awk, lo script completo della shell ora assomiglia a questo:

#!/bin/bash
for file in $@; do
        if [ -f $file ] ; then
                #print out filename
                echo "File is: $file"
                #print the total number of times linux-console.net appears in the file
                awk ' BEGIN {  print "The number of times linux-console.net appears in the file is:" ; }
                      /^linux-console.net/ {  counter+=1  ;  }
                      END {  printf "%s\n",  counter  ; } 
                    '  $file
        else
                #print error info incase input is not a file
                echo "$file is not a file, please specify a file." >&2 && exit 1
        fi
done
#terminate script with exit code 0 in case of successful execution 
exit 0

Quando eseguiamo lo script sopra, verrà prima stampata la posizione del file domains.txt, quindi verrà eseguito lo script di comando Awk, dove BEGIN Il modello speciale ci aiuta a stampare il messaggio "Il numero di volte in cui linux-console.net appare nel file è: " prima che qualsiasi riga di input venga letta dal file.

Quindi il nostro pattern, /^linux-console.net/ viene confrontato con ogni riga di input e con l'azione, { counter+=1 ; } viene eseguito per ogni riga di input, che conta il numero di volte in cui linux-console.net appare nel file.

Infine, il pattern END stamperà il numero totale di volte in cui il dominio linux-console.net appare nel file.

./script.sh ~/domains.txt 

Per concludere, abbiamo esaminato altre funzionalità di Awk esplorando i concetti di pattern speciale: BEGIN e END.

Come ho sottolineato prima, queste funzionalità di Awk ci aiuteranno a creare operazioni di filtraggio del testo più complesse, c'è altro da trattare nelle funzionalità di Awk e nella parte 10, affronteremo le idea delle variabili integrate di Awk, quindi resta connesso.

Articoli correlati: