Awk, un petit parfum de C

Awk est un langage qui, si on le maîtrise bien, permet quasiment tout type de traitement sur les textes. Je vous présente les commandes et syntaxes qui me sont le plus utiles.


Quelques exemples de traitements simples

Commandes Commentaires
awk '{print}' in.txt >out.txt imprime tout le fichier (idem que la commande [cat fichier.txt]) :
awk '/toto/ {print}' fichier.txt imprime les lignes contenant "toto" (idem que la commande [grep toto fichier.txt])
awk '!/toto/' fichier.txt imprime les lignes ne contenant pas "toto" (idem que la commande [grep -v toto fichier.txt])
awk '/toto/ {print $2}' fichier.txt imprime le 2eme champ si la ligne contient 'toto'
awk '$1=="toto" {print $2}' fichier.txt imprime le 2eme champ si le premier champ = toto
awk '$1~/toto/ {print $2}' fichier.txt imprime le 2eme champ si le premier champ contient 'toto'
awk ' /DEBUT/,/FIN/' fichier.txt imprime les lignes a partir de la chaîne 'DEBUT', j'usqu'a la chaîne 'FIN'
awk '/text/||/TEXT/ { var = var " " $0 } END { dt="'`date +%Y%m%d`'"; print var " " dt}' fichier.txt si une ligne contient 'text' ou 'TEXT', le contenu de la ligne est concaténé dans une variable, puis affiché avec la date au format YYMMDD
awk '{if ($3 < 2000) print $3, " ",$7}' fichier.txt imprime les champs 3 et 7 si le champ 3 est inférieur 2000
awk -F":" '{ print $3 "\t" $1 }' /etc/passwd |sort -g Affiche le 3ème champ (utilisateurs) par numéro croissant ; séparateur (-F) = ':'


Les substitutions ou remplacements de chaînes de caractères

Commandes Commentaires
awk -v v1=$CHAINE -v v2=$VAR2 '{sub(v1,"autre_chose"); print}' fichier.txt remplace le contenu de la variable $CHAINE par "autre_chose"
awk '!/rien/{gsub(/chaine/, "autre chose")};{print}' fichier.txt remplace "chaine" par "autre chose", sauf si la ligne contient la chaîne "rien"
awk -v v1=$CHAINE '{ while ($0!~v1) { getline } ; print }' fichier.txt A voir... (tant que, not négation)
awk '{gsub(/rouge|vert|bleu/, "couleur"); print}' fichier.txt remplace toutes les occurrences de "rouge", "vert", "bleu" par "couleur"
awk '{ if (/condition/) {sub(/chaine/,"autre_chose")} ; print}' fichier.txt Si la ligne contient "condition", "chaine" est remplacée par "autre_chose"
awk '!($0 in a) {a[$0]; print}' fichier.txt supprime toutes les lignes dupliquées
awk '{ sub(/'^select'/,";\nselect"); print}' fichier.sql ajoute un ';' ainsi qu'un retour chariot avant chaque ligne contenant '^select'


~~DISCUSSION~~