Awk è 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
Tutti i comandi e variabile riassunte in: awk cheat sheet
Popular Posts:
- None Found
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
Ciao Antonio
Grazie mille per la segnalazione, esempi corretti come da tue indicazioni 😉
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 }’
6 RENAME SOME FILES
there is also rename – man rename