Jan 182011
 

awkAwk è sempre stato per me fonte di grande odio ed amore, è un comando incredibilmente potente e con il quale è possibile costruire veri e propri programmi.

In questo articolo voglio darvi 6 esempi pronti per l’uso da riutilizzare nel vostro terminale preferito.

AWK è un linguaggio orientato alla manipolazione di dati di tipo testuale, sia in forma di file che di flusso di dati provenienti dallo standard input. Il nome AWK deriva dalle iniziali dei cognomi dei suoi autori: Alfred Aho, Peter Weinberger, e Brian Kernighan.
AWK è un tipico linguaggio che usa in maniera estensiva il tipo stringa, gli array associativi (cioè, array indicizzati tramite stringhe chiave), e le espressioni regolari.




AWK può essere usato come filtro, è stato uno dei primi strumenti a fare la sua comparsa dalla versione 7 di Unix ed ottenne la giusta fama di essere un modo per aggiungere capacità computazionali ad una pipeline Unix. L’AWK è ormai presente fra le applicazioni standard di ogni versione recente di sistema operativo Unix disponibile oggi. Implementazioni di AWK esistono comunque per quasi tutti gli altri sistemi operativi.
Solitamente AWK è un linguaggio interpretato, cioè esiste un file eseguibile chiamato awk che legge o da riga di comando o da un file il programma vero e proprio scritto in linguaggio awk e lo applica ad uno o più file di ingresso per produrre un risultato.

1 Rimuovere le voci duplicate in un file senza riordinarlo.

Usando awk, trovare i duplicati in un file senza usare sort, che riordina il contenuto. awk non li riordina, e trova e rimuove i duplicati che si possono quindi reindirizzare in un altro file.

#awk '!x[$0]++'

Esempio

echo -e "aaanbbbnaaanaancccnaa"|awk !'x[$0]++'

output:

aaa
bbb
aa
ccc

2 Somma la dimensione di un certo gruppo di file

Con questo comando è possibile selezionare alcuni file e sommare le loro dimensioni, ad esempio per sommare la dimensione di tutti i file in una directory:

ls -l | awk '{s = s+$5 }; END { print s }'

O per sommare tutti i vostri file di tipo .mp3 nella directory corrente e sottodirectory:

ls -lR |grep .mp3 | awk '{s = s+$5 }; END { print s }'

E così via, cambiate il vostro comando ls e potete selezionare differenti nomi o tipologie di file.

3 Alternativa al comando precedente con find

Cercare in tutto il computer i vostri file .mp3 e sommare le loro dimensioni:

find / -name "*.mp3" -exec ls -l {} ; | awk '{s = s+$5 }; END { print s }'

4 Mostra i comandi usati più spesso prendendoli dalla history

Lista dei comandi utilizzati più spesso

history | awk '{a[$'`echo "1 2 $HISTTIMEFORMAT" | wc -w`']++}END{for(i in a){print a[i] "t" i}}' | sort -rn | head

5 Analizza un file per vedere come viene visto da awk

Scompone e numera ogni riga ed i suoi campi. Questo è molto utile quando si sta per analizzare qualcosa con awk ma non si sa esattamente da dove cominciare.

awk '{print NR”: “$0; for(i=1;i<=NF;++i)print “t”i”: “$i}'

6 rinominare una serie di file

Mostrare una serie di file e rinominarli con estensione .new

 ls -1 pattern | awk '{print "mv "$1" "$1".new"}' | sh

E’ possibile variare il pattern per mostrare solo una determinata tipologia di file.

Riferimenti

  • Robbins, Daniel (2000-12-01). “Awk by example, Part 1: An intro to the great language with the strange name”. Common threads. IBM DeveloperWorks. http://www.ibm.com/developerworks/linux/library/l-awk1.html. Retrieved 2009-04-16.
  • Robbins, Daniel (2001-01-01). “Awk by example, Part 2: Records, loops, and arrays”. Common threads. IBM DeveloperWorks. http://www.ibm.com/developerworks/linux/library/l-awk2.html. Retrieved 2009-04-16.
  • Robbins, Daniel (2001-04-01). “Awk by example, Part 3: String functions and … checkbooks?”. Common threads. IBM DeveloperWorks. http://www.ibm.com/developerworks/linux/library/l-awk3.html. Retrieved 2009-04-16.
  • AWK  – Become an expert in 60 minutes
  • awk tutorial
  • Tutti i comandi e variabile riassunte in: awk cheat sheet

    Popular Posts:

    Flattr this!

      4 Responses to “6 Trucchi con awk”

    1. ciao,
      ho trovato molto interessante il post.
      Ho sempre avuto interesse su awk che trovo molto versatile e comodo.
      Mi è piaciuto in particolare l’esempio 1 per la rimozione dei duplicati di cui non ho capito il funzionamento, devo studiare ancora qualche sfaccettatura del linguaggio.
      Ho solo notato due inesattezze negli esempi 2 e 3.
      Nel 2 sono elencati solo i file il cui nome termina per .mp3 contenuti nella directory corrente in quanto è la shell che sostituisce *.mp3 con l’elenco dei file passandoli poi come argomenti al comando ls e non li cerca in modo ricorsivo.
      Nel 3 non viene trovato alcun file perchè il valore da passare all’opzione -name dovrebbe essere *.mp3 e per evitare che tale valore venga sostituito con i nomi di file presenti nella directory corrente conviene racchiuderlo tra doppie virgolette così: “*.mp3”.
      Spero di essere stato utile e che il mio intervento sia gradito

      ciao

    2. Instead: ls -lR |grep .mp3 | awk ‘{s = s+$5 }; END { print s }’
      you can use awk to filter like:
      ls -lR | awk /.mp3/ ‘{s = s+$5 }; END { print s }’

    3. 6 RENAME SOME FILES

      there is also rename – man rename

    Leave a Reply to soi Cancel reply

    You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

    (required)

    (required)

    *