Sed & Awk : Quelques exemples de ces merveilles
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 :
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 :
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 :
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 :
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 :
sed |
sed s/.*tache.*/\\0/ > mon_linge_propre |
Pour effacer les lignes correspondant au pattern en question (ici on supprime les lignes vides) :
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 :
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) :
sed |
sed -i 's/sysconfig/defaults/' cgconfig |
Pour les puristes, on peut le faire également faire une substitution en perl :
perl |
perl -pe 's/toto/tata/g' < monfichier |
Remplacer à la volée le contenu d'un fichier :
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) :
replace |
replace -v from to from to "persistence=FILE" "persistence=BRIDGEPERSISTENCE" -- *.ini |
ou encore :
find |
find . -name "*.c" -exec sed -i "s/oldWord/newWord/g" '{}' \; |
Supprimer la 10ème ligne d'un fichier :
sed |
sed -i '10d' |
Supprimer les x lignes à partir d'un numéro de ligne :
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 :
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 :
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 :
awk |
ps aux|awk '{printf("PID: %s utilise par %s\n"), $2, $1}' |
Afficher l’/etc/passwd bien rangé :
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 :
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 :
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 :
grep |
grep ^root < /etc/passwd |
ou
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 :
grep |
grep -v root < /etc/passwd |
Combiner les grep :
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 :
grep |
grep -A2 string filename |
Pour voir 2 lignes après
grep |
grep -B2 string filename |
Pour voir 2 lignes avant et après :
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 :
grep |
grep -a monfichier |
Le -a bypassera la restriction