Sed & Awk : Quelques exemples de ces merveilles

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

Sed & Awk, Ok mais c'est quoi ? Ce sont 2 binaires permettant de faire du filtrage de contenu. Exemple vous avez un fichier et vous voulez sortir que tel ou tel ligne, voir meme remplacer des choses dans un fichier. Biensûre ce que je vous dis là n'est pas extraordinaire, mais combiné aux regex, ca devient très puissant.

2 Sed

Afficher certaines lignes d'un gros fichier :

Command sed
sed -n "$LINE1,${LINE2}p;${LINEA2}q;" "$FILE"

Remplacer toutes les occurences du mot “tache” par le mot “blancheur” dans le fichier mon_linge, on redirige le tout vers le fichier mon_linge_propre :

Command sed
sed s/tache/blancheur/g mon_linge > mon_linge_propre

Remplacer tous les debuts de ligne par un “.” dans le fichier mon_linge, on redirige le tout vers mon_linge_bien_range :

Command sed
sed s/^/./ > mon_linge_bien_range

Remplacer tous les fins de ligne par un “.” dans le fichier mon_linge, on redirige le tout vers mon_linge_bien_range :

Command sed
sed s/$/./ > mon_linge_bien_range

Effacer toutes les lignes contenant le mot “tache”, on redirige le tout vers le fichier mon_linge_propre :

Command sed
sed s/.*tache.*/\\0/ > mon_linge_propre

Pour effacer les lignes correspondant au pattern en question (ici on supprime les lignes vides) :

Command sed
sed '/^$/d' monfichier

Effacer toutes les lignes contenant le mot “tache” et remplacer tous les fins de ligne par un “.”, on redirige vers mon_linge_qui_sent_bon :

Command sed
sed -e 's/$/./' -e  's/.*tache.*/\\0/' > mon_linge_qui_sent_bon

Pour faire de la modification directement sans passer par un autre fichier (on the fly) :

Command sed
sed -i 's/sysconfig/defaults/' cgconfig

Pour les puristes, on peut le faire également faire une substitution en perl :

Command perl
perl -pe 's/toto/tata/g' < monfichier

Remplacer à la volée le contenu d'un fichier :

Command perl
perl -pi -e "s/HOSTNAME=.*/HOSTNAME=node3.deimos.fr/" /etc/sysconfig/network

Ou encore avec la commande replace (qui ici remplace dans tous les *.ini du dossier courant) :

Command replace
replace -v from to from to "persistence=FILE" "persistence=BRIDGEPERSISTENCE" -- *.ini

ou encore :

Command find
find . -name "*.c" -exec sed -i "s/oldWord/newWord/g" '{}' \;

Supprimer la 10ème ligne d'un fichier :

Command sed
sed -i '10d'

Supprimer les x lignes à partir d'un numéro de ligne :

Command sed
sed '1,55d' fichier.old > fichier.new

Ceci va supprimer les lignes de 1 à 55

3 Awk

Afficher la 2eme colonne ( PID ) du resultat d’un ps aux :

Command awk
ps aux|awk '{print $2}'

Afficher la 2eme colonne ( PID ) du resultat d’un ps aux en le faisant précéder d’un label :

Command awk
ps aux|awk '{printf("PID: %s\n"), $2}'

Afficher la 2eme colonne ( PID ) du resultat d’un ps aux en le faisant précéderd’un label et en affichant l’utilisateur :

Command awk
ps aux|awk '{printf("PID: %s utilise par %s\n"), $2, $1}'

Afficher l’/etc/passwd bien rangé :

Command awk
awk -F: '{printf("Utilisateur: %s\nUID: %s\nGID: %s\nNom: %s\nHome: %s\nShell: %s\n", $1, $3, $4, $5, $6, $7)}' /etc/passwd

Utiliser les fonctions mathématiques :

Command awk
echo "3 4" | awk '{print int($1+$2)}'

(affiche normalement 7, si tout se passe bien) Il est possible d'avoir l'équivalent d'un grep et d'un awk dans le même awk :

Command awk
ip a | awk '/inet/{print $2}'

Ici ça me permet de récupérer toutes les IP présentes sur ma machine.

Pour plus d'exemples : AWK - le langage script de référence pour le traitement de fichiers

4 Grep

Grep n'était pas prévu au programme, mais voilà, j'en rajoute quand même :-)

Pour afficher que la ligne root dans /etc/passwd :

Command grep
grep ^root < /etc/passwd

ou

Command grep
cat /etc/passwd | grep ^root

Mais cette dernière ligne fait appelle à une autre instruction (cat), qui n'est pas nécessaire.

Pour afficher toutes es lignes sauf celles contenant root :

Command grep
grep -v root < /etc/passwd

Combiner les grep :

Command grep
cat /etc/passwd | grep -e toto -e tata -e titi

Il est possible de voir les lignes avant ou après le résultat de grep. Pour voir 2 lignes avant :

Command grep
grep -A2 string filename

Pour voir 2 lignes après

Command grep
grep -B2 string filename

Pour voir 2 lignes avant et après :

Command grep
grep -C2 string filename

5 FAQ

5.1 Binary database matches

Si vous rencontrez cette erreur lors d'un grep, c'est que votre fichier doit être trop gros, et donc grep le considère comme un binaire. Mais si cen 'est pas le cas, vous pouvez le forcer à lire quand même :

Command grep
grep -a monfichier

Le -a bypassera la restriction

6 Ressources

Tutoriel pour Sed
Awk cheat sheet