Sed et AWK

Cette page a pour but de recenser les différents usages de SED, cette merveilleuse commande qui m'a fait gagner beaucoup de temps, et qui m'en a demandé le double pour comprendre son bon fonctionnement.

SED (Stream EDitor) est un outil unix/linux de la norme posix. C'est un langage a lui tout seul, le gérer demande enormément de temps et de pratiques, et son lot de fails vient avec.

Le premier conseil que je peux donner avant de commencer a utiliser SED est de se familiariser avec les REGEX car on en utilise un sacré paquet.

SED

Regex

Cette partie ne va pas exploiter les regex de [A-Z] mais donnera une base sur laquelle partir pour commecer a utiliser SED.

┌──────────┬────────────────────────────────────────────────────────────────┐
│Character │	                     Description                            │
├──────────┼────────────────────────────────────────────────────────────────┤
│^	   │ Match le debut d'une ligne                                     │
├──────────┼────────────────────────────────────────────────────────────────┤
│$	   │ Match la fin d'une ligne                                       │
├──────────┼────────────────────────────────────────────────────────────────┤
│.	   │ Match tout caractère seul                                      │
├──────────┼────────────────────────────────────────────────────────────────┤
│*	   │ Match 0 ou plusieurs occurences du dernier caractère           │
├──────────┼────────────────────────────────────────────────────────────────┤
│[chars]   │ Match n'importe quel caractère entre crochets                  │
└──────────┴────────────────────────────────────────────────────────────────┘


┌──────────┬────────────────────────────────────────────────────────────────┐
│expression│	                     Description                            │
├──────────┼────────────────────────────────────────────────────────────────┤
│ /a.c/	   │ Match les lignes qui contiennent                               │
│          │ a+c, a-c, abc, match, et a3c                                   │
├──────────┼────────────────────────────────────────────────────────────────┤
│/a*c/	   │ Matches les lignes qui contiennent plusieurs fois la lettre c  │
│          │ tel que ace, yacc, and arctic.                                 │
├──────────┼────────────────────────────────────────────────────────────────┤
│/[tT]he/  │ Match les mots The and the:                                    │
├──────────┼────────────────────────────────────────────────────────────────┤
│/^$/	   │ Match les lignes blanches                                      │
├──────────┼────────────────────────────────────────────────────────────────┤
│/^.*$/	   │ Match toute la ligne, peu importe ce qu'elle contient          │
├──────────┼────────────────────────────────────────────────────────────────┤
│/ */	   │ Match un ou plusieurs espaces                                  │
└──────────┴────────────────────────────────────────────────────────────────┘
 
┌───────────┬────────────────────────────────────────────────────────────────┐
│ Set       │	                     Description                             │
├───────────┼────────────────────────────────────────────────────────────────┤
│ [a-z]	    │ Match une lettre minuscule                                     │
├───────────┼────────────────────────────────────────────────────────────────┤
│ [A-Z]	    │ Match une lettre majuscule                                     │
├───────────┼────────────────────────────────────────────────────────────────┤
│ [a-zA-Z]  │ Match une lettre                                               │
├───────────┼────────────────────────────────────────────────────────────────┤
│ [0-9]	    │ Match un nombre                                                │
├───────────┼────────────────────────────────────────────────────────────────┤
│[a-zA-Z0-9]│ Match un nombre ou une lettre                                  │
└───────────┴────────────────────────────────────────────────────────────────┘

Suppression

supprimer ligne 1:

sed -e "1d;" file

supprimer lignes 1 et 3:

sed -e "1d;3d" file

supprimer lignes 1 à 3:

sed -e "1,3 d" file

Supprime les lignes vides ou celles n'ayant que 1 seul caractère #

sed -e '/^$/d;/^#$/d'

supprime les lignes qui commencent par un #

sed -i '/^#/d' file

supprime les lignes vide

sed -i '/^\s*$/d' file

supprime le texte entre les ()

sed "s/[(][^)]*[)]/()/g"

Substitution

remplace lastname par nom etc… /g pour l'appliquer a chaque occurrence dans notre fichier, sinon SED remplace que la 1ere.

sed -re 's/lastname/nom/g; s/Firstname/prenom/g;s/genre/sexe/g;s/age/datedenaissance/g' file_2015-04-05

remplace le chiffre 20 de la ligne qui commence par age par vingt

sed -re '/^age/s/20/vingt/g;' file

modifie la lettre a du mot age par â

sed -re '/^age/y/a/â/' file

rajoute un # au début de chaque ligne contenant le mot “swap”

sed '/swap/ s/^/#/g' /etc/fstab

Scripts

scriptsed.sh
sed -f scriptsed.sh passwd
Utilisation pour le fichier passwd
/^root/s/0:0/1337:1337/g;s/root/superuser/g
/^client/s/client,,,/client/g
/^client/s/1000:1000/1234:1234/g;s/client/toto/g
y/o/0/

Rename

ls | sed -re "s/^anciennom(.*)/mv '&' 'nouveaunom\1'/" | sh
for file in *.txt ; do mv $file `echo $file | sed 's/\(.*\)\.txt/\1/'` ; done

Between

sed -n '/WORD1/,/WORD2/p' /path/to/file

supprimer le texte entre les lignes start et end

sed -i '/start/,/end/{//!d}' file

SED et Find

Recherche dans tout les fichiers d'une arborescence la chaine “toto” et la remplace par “tutu”

find ./ -type f -exec sed -i -e 's/toto/tutu/g' {} \;

Misc

Afficher la 15eme ligne:

sed -n 15p

Backreference

Rajoute un # devant chaque mot contenant “swap”

sed "s/\(.*swap\)/#\1/g" /etc/fstab
 
 
/dev/mapper/VG01-lv_root /               ext4    errors=remount-ro 0       1
/dev/mapper/VG01-lv_boot /boot           ext4    defaults        0       2
/dev/mapper/VG01-lv_var /var            ext4    defaults        0       2
#/dev/mapper/VG01-lv_swap none            #swap    sw              0       0
#Custom LVM
/dev/mapper/VG02-lvDATA /Data            ext4    defaults        0       2

AWK

print les lignes contenant la chaine “String”

> cat file | awk '/String/{ print $0 }'
String.toto = toto
String.tutu -> tutu

print la chaîne de caractères contenant la chaine “String”

> cat file | awk '{for(i=1;i<=NF;i++){if($i~/^String/){print $i}}}'
String.toto
String.tutu

print les lignes comprises entre les patterns Start et End

> awk '/End/{f=0;};f{print;};/Start/{f=1;}'
Start
String.toto = toto
String.tutu -> tutu
End

Ajoute une variable shell dans la commande SED

var="1234"
awk -v var="$var" 'print {var}'
wiki/sed.et.awk.txt · Dernière modification: 2018/05/09 19:40 par root
CC0 1.0 Universal
Powered by PHP Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 Valid HTML5