En finir avec sed, awk, grep

Publié le par Peck

Cet article est maintenant sur http://linux-attitude.fr/post/En-finir-avec-sed-awk-grep

Niveau
:
Résumé: perl -i -pe

La puissance de perl en fait un excellent remplaçant de sed, awk et grep tous réunis. Il permet de n'apprendre qu'une syntaxe plutôt que 3 et de plus possède des expression régulière très puissantes.

Je vais tenter de vous convaincre par l'exemple à base de quelques tâches courantes effectuées habituellement avec ces outils.


Commenter des lignes comme en sed :
$ sed 's/^/#/'
$ perl -pe 's/^/#/'

Formater des lignes comme en awk :
$ awk '{print "$1:$3"}'
$ perl -ne 'split; print "$_[0]:$_[2]n"'

Sélectionner des lignes comme en grep :
$ grep "^[0-9]"
$ perl -ne 'print if /^[0-9]/'


Perl dispose de l'option -i comme sed. Cette option permet d'éditer les fichiers en ligne. Si un mot est ajouté après -i, le fichier sera sauvegardé.
$ perl -i.bak -pe '$i++; s/^/$i /' file # numérote les lignes du fichier


Tout comme  awk, perl supporte l'exécution de code au début et à la fin de la boucle :
# Implémentation de head en perl
$ perl -ne 'BEGIN{$i=10}{print if $i-->0}'

# Implémentation de wc -l en perl
$ perl -ne '{$i++}END{print "$in"}'


L'avantage d'utiliser perl est que le jour ou vous voulez faire grossir votre script, c'est très simple.

perl -pe '...' -> while(<>) { ... ; print }
perl -ne '...' -> while(<>) { ... }

Par exemple faisons grossir notre wc pour afficher un peu plus (dans un fichier) :
#!/usr/bin/perl
$char=0;
$word=0;
$line=0;
while(<>)
{
   $char += length;
   split;
   $word += scalar @_;
   $line++;
}
print "$line $word $charn";

Publié dans admin

Commenter cet article

Chtarsky 08/07/2007 23:40

Chouette ! À garder en bookmark :-)