Filtres

mardi 16 septembre 2008
par  Jerome ROBERT
popularité : 6%

 

X. Commandes et filtres

A. Introduction

 

Un filtre est une commande qui lit des informations sur l'entrée standard, les traite par ligne, puis qui affiche ses résultats sur la sortie standard :

 

En aucun cas le contenu du fichier d'origine n'est modifié !

Nous connaissons déjà des filtres : cat, more.

Nous allons étudiés quelques autres, la plupart en partie seulement : n'hésitez pas à consulter la man page associée.

 

B. les commandes head et tail

head -N fic

 affiche les N premières lignes de fic.

tail -N fic

 affiche les N dernières lignes de fic.

tail +N fic

 affiche de la ligne N à la fin de fic.

Par défaut, N vaut 10.

 

C. La commandes wc

wc Compter les lignes, mots et caractères d’un fichier

wc [ -lwc ] fichier

-l nombre de lignes

-w nombre de mots

-c nombre de caractères

exemple:

$ wc fic

45 440 3053 fic

$ wc -l fic

45 fic

$ wc -cw fic

3053 440 fic

$ wc toto tutu titi

1 6 29 toto

46 448 3105 tutu

40 462 1773 titi

87 916 4907 total

 

D. La commande find

Elle permet la recherche de fichiers, suivant de multiples critères, à partir d’un (ou plusieurs) répertoire(s). La recherche a lieu dans toute la sous-arborescence. Des notations complémentaires permettent d’effectuer des recherches composées ( ET , OU ).

find répertoire options actions

Quelques options

-name fichier

 Recherche sur le nom ( protéger les caractères spéciaux vis à vis du shell )

-perm mode Recherche sur les permissions ( masque en octal )
-newer fichier

 Recherche des fichiers plus récents qu’un fichier donné

-user login Recherche sur le propriétaire
-mtime +n

Fichiers modifiés depuis plus de n jours

-mtime -n

 Fichiers modifiés depuis moins de n jours

-atime +n

 Fichiers consultés depuis plus de n jours

-atime -n 

Fichiers consultés depuis moins de n jours

etc ...

 

 

Actions ( exclusives )

-print

 Afficher les résultats

-exec  

Lancer une commande pour chaque fichier trouvé

-ok

 Lancer une commande pour chaque fichier trouvé, après demande de confirmation

Exemples de manipulation de la commande find

$ find . -name .??*rc -print

UX:find: ERROR: Illegal option -- .mwmrc

UX:find: TO FIX: Usage: find path-list predicate-list

$ find . -name '.??*rc' -print

./.exrc

./.mwmrc

./.cshrc

$

$ find /home -user stage1 -print

/home/stage1

/home/stage1/.profile

/home/stage1/.rhosts

/home/stage1/.exrc

/home/stage1/.mwmrc

/home/stage1/.xsession

/home/stage1/.sh_history

/home/stage1/toto

/home/stage1/tutu

UX:find: ERROR: Cannot read dir /home/ftp/usr: Permission denied

UX:find: ERROR: Cannot read dir /home/ftp/etc: Permission denied

UX:find: ERROR: Cannot read dir /home/ftp/dev: Permission denied

$

Exemples de manipulation de la commande find ( suite )

$ find /home -user stage1 -name '.??*rc' -print

/home/stage1/.exrc

/home/stage1/.mwmrc

UX:find: ERROR: Cannot read dir /home/ftp/usr: Permission denied

UX:find: ERROR: Cannot read dir /home/ftp/etc: Permission denied

UX:find: ERROR: Cannot read dir /home/ftp/dev: Permission denied

$

$ find . \( -name '.??*rc' -o -mtime -1 \) -print

.

./.exrc

./.mwmrc

./.sh_history

./main.c

$

$ find /home/stage1 /home/stage2 -name '*toto*' -print

/home/stage1/toto

/home/stage2/toto

/home/stage2/toto1

/home/stage2/toto2

$

$ find /home -name .profile -ok wc {} \;

< wc ... /home/boss/.profile >? y

20 124 660 /home/boss/.profile

< wc ... /home/stage1/.profile >? n

< wc ... /home/stage2/.profile >? n

< wc ... /home/stage3/.profile >? y

25 39 390 /home/stage3/.profile

< wc ... /home/stage4/.profile >? n

$

 

$ find /home -name .profile -exec wc {} \;

20 124 660 /home/boss/.profile

25 39 390 /home/stage1/.profile

25 39 390 /home/stage2/.profile

25 39 390 /home/stage3/.profile

25 39 390 /home/stage4/.profile

$

$ find . -name core -ok rm {} \;

< rm ... ./core >? y

< rm ... ./rep/core >? y

$

 

 

E. la commande sort

sort [options] [ +pos1 [ -pos2 ] ] fichiers...

 

$ sort -d fic tri suivant l'ordre du dictionnaire.

$ sort -n fic tri numérique.

$ sort -r fic tri en ordre décroissant.

$ sort -u fic conserve une seule occurrence de lignes identiques.

$ sort -t: -k3 fic tri sur le troisième champ (séparateur :)

 

L’unité de traitement est la ligne ou le mot ( champ ). Le critère de tri par défaut est le code Ascii. De multiples options permettent de choisir des critères plus réalistes ( alphabétique, numérique ... ). Si aucun fichier n'est donné en argument ou si on utilise le caractère - ( signe moins ), la commande traite son entrée standard. Le résultat du tri est écrit sur la sortie standard.

 

Options usuelles

-u  Suppression de lignes multiples dans le résultat
-o fichier

Sauvegarde du résultat dans le fichier spécifié ( Ce fichier peut être un des fichiers d'entrée )

-d 

Seuls les lettres, chiffres, espaces et tabulations sont significatifs pour le tri

-f 

Minuscules et MAJUSCULES sont confondues

-n

 Tri numérique

-r

 Résultat en ordre décroissant

-tcar

  Redéfinition du caractère séparateur

-b 

Option quasi-indispensable dans les tris alphabétiques ( pour une bonne gestion du nombre variable d'espaces entre les champs )

etc...

 

 

Utilisation des champs

Les notations +pos1 [ -pos2 ] permettent d’indiquer que le tri doit s’effectuer uniquement sur certains champs de la ligne. Il est possible d’indiquer plusieurs couples de position pour opérer un tri à plusieurs passes.

Ces positions s’expriment sous la forme m.n éventuellement suivie d'une ou plusieurs options parmi b , d , f , i , n ou r .

m Nombre de champs à sauter depuis le début de la ligne

n Nombre de caractères à sauter depuis le début du champ

Quelques exemples

sort +1 -2 fichier

 Tri ( critère Ascii ) sur le deuxième champ

sort -rn -o fichier +4 -5 fichier

 Tri ( critère numérique, ordre décroissant ) sur le cinquième champ et résultat dans le fichier d’entrée

sort -t: +2n -3 /etc/passwd  

Tri du fichier /etc/passwd selon le numéro de «login» ( redéfinition du séparateur de champs )

sort +3.0bf -3.2bf fichier

 Tri sur les deux premiers caractères du quatrième champ ( minuscules et majuscules confondues )

sort +3n -4 +0fb -1 fichier

 Tri sur le quatrième champ ( critère numérique ) puis deuxième passe sur le premier champ ( minuscules et majuscules confondues )

 

F. la commande cut

cut extrait certains champs ou certaines colonnes(1 caractère de large) d'un fichier texte

La commande cut extrait des sous-parties verticales d'un fichier texte.

cut peut travailler sur des champs (séparés par le caractère suivant l'option -d ou par défaut par une tabulation). La plupart des fichiers systèmes d'Unix contiennent des champs séparés par le caractère ':'

cut [ options ] fichiers

Options

-d car

 Définition du séparateur de champs ( l'espace devra être défini entre "" )

-f liste  

Liste des numéros des champs à extraire

-c liste

 Liste des positions des caractères à extraire

 

Dans certains cas (tel que la sortie de la commande who) les différentes informations ne sont pas séparées par un caractère spécial mais par un nombre variable de blancs. On est donc amené à utiliser la commande cut sur des colonnes (1 caractère de large).

Exemples :  

$ cut -c12-18,20-25 fich

  récupère les colonnes 12 à 18 et 20 à 25

$ cut -f1,6 -d: /etc/passwd 

extrait les champs 1 et 6 délimités par :

 

<

a) Numérotation des colonnes ou des champs

 

A-B

de A à B inclus

A-

de A à la fin (dernier)

-B

du début (premier) à B

A,B

A et B

 

Exemple :

$ cut -d: -f 1,3,6-7 /etc/passwd

root:0:/:/sbin/ksh

daemon:1:/:

bin:2:/usr/bin:

sys:3:/:

..............

stage1:1001:/home/ecole1:/usr/bin/ksh

stage2:1002:/home/ecole2:/usr/bin/ksh

..............

$ echo Bonjour cher ami | cut -d" " -f 1,3

Bonjour ami

$

$ echo Bonjour cher ami | cut -c 1-3,14-16

Bonami

$

$ echo Bonjour cher ami | cut -c 8-

cher ami

$

 

G.  la commande grep

grep recherche des lignes dans un fichier texte et les affiche sur la sortie standard

 

syntaxe : grep motifRecherché fichier [ fichier2 ...]

 

Le motif est une expression régulière. Sans autre option , grep retourne l'ensemble des lignes contenant le motif indiqué (même s'il n'est qu'une partie d'un mot).

Ces filtres permettent de rechercher des expressions littérales ou «régulières» dans des fichiers.

Les expressions régulières consistent en un vocabulaire permettant d’exprimer une sémantique puissante de recherche ( voir une première présentation dans le chapitre 3 ).

Les lignes comportant les expressions recherchées sont affichées sur la sortie standard.

 

 

Il y a trois filtres :

grep

  Recherche d'expressions littérales et/ou régulières

egrep

  Accepte des expressions plus riches que «grep»

fgrep

  Ne traite que des expressions littérales mais est plus compact et performant

 

 

Quelques Options

-i 

MAJUSCULES et minuscules sont confondues

-v

 Les lignes ne comportant pas l'expression

-x 

Les lignes exactement identiques à l'expression ( «fgrep» seulement )

-c

 Afficher le nombre de lignes trouvées

-l 

Afficher uniquement les noms des fichiers

-n

 Chaque ligne est précédée de son numéro dans le fichier

-e expr 

Permet de chercher une expression commençant par - ( signe moins )( ne fonctionne pas avec «grep» )

-f fichier 

Les expressions cherchées sont décrites dans un fichier ( une par ligne )( ne fonctionne pas avec «grep» )

 

Quelques Expressions Régulières

Début de ligne

$

 Fin de ligne ( se place en fin d'expression )

.  Présence d’un caractère quelconque
[caractères]  Un caractère parmi un ensemble
[^caractères

Un caractère ne figurant pas dans l’ensemble

car*

 Un nombre quelconque d'apparitions du caractère ( éventuellement 0 )

exp1|exp2

 Le caractère | signifie OU et relie deux expressions ( egrep )

Notations fréquentes et utiles

^$

 Ligne vide ( un début et une fin )

.

  Ligne non vide

.*

 Â«Reste de la ligne» ou «ligne complète» suivant le contexte

 

Quelques exemples

grep '^abc' fichier

 Lignes commençant par la chaîne «abc»

grep '^[abc]' fichier

 Lignes commençant par a ou b ou c

grep ‘^[^0-9]’ fichier

 Lignes ne commençant pas par un chiffre

grep 'abc.$' fichier

 Lignes se terminant par la chaîne «abc» suivie d’un caractère quelconque

fgrep -f motifs fichier

 Recherche des expressions littérales indiquées dans le fichier «motifs»

grep -n '^' fichier

 Numéroter toutes les lignes ( toutes les lignes ont un début )

grep -i 'toto *$' fichier  

Lignes se terminant par la chaîne «toto» ( minuscules ou majuscules ) suivie d’un nombre quelconque d’espaces

egrep '^abc|ef *$' fichier

  Lignes commençant par la chaîne «abc» ou bien se terminant par la chaîne «ef» suivie d’un nombre quelconque d’espaces ( Penser à invoquer "egrep" , grep ne connaît pas le signe | )

 

H. La commande tr

Ce filtre lit l'entrée standard pour effectuer des substitutions ou des suppressions de caractères.

Les résultats sont écrits sur la sortie standard.

tr [options] [ chaine1 [ chaine2 ] ]

Dans la syntaxe de base, les caractères mentionnés dans «chaine1» sont remplacés par ceux de même position dans «chaine2».

Des abréviations sont possibles pour désigner des ensembles de caractères :

[a-z]   Les lettres minuscules ( intervalle )
[a*n]   n fois le caractère a ( * seul signifie : «un nombre quelconque» )
\xyz

Code Ascii en octal du caractère

 

Options

 -d

Supprimer les caractères apparaissant dans «chaine1»

-s

Les caractères consécutifs identiques sont réduits à un seul exemplaire

-c

Négation -> Les caractères n'apparaissant pas dans «chaine1»

 

Quelques exemples

tr "[a-z]" "[A-Z]" < fichier

  Transformer les minuscules en MAJUSCULES.

tr -sc "[A-Z][a-z]" "[\012*]" < fichier

  Les caractères non alphabétiques sont transformés en un saut de ligne. Les sauts de ligne consécutifs sont éliminés. On obtient un mot alphabétique par ligne.

tr -d "abcd" < fichier

  Les caractères a , b , c et d sont supprimés.

 

 

I. La commande sed

Ce filtre est un éditeur non interactif qui copie les fichiers d'entrée sur la sortie standard après leur avoir appliqué un certain nombre de commandes.

sed [-n] 'commandes_sed' fichiers...

ou

sed [-n] -f fichier_commandes fichiers...

 

 

Syntaxe des commandes sed et principe de fonctionnement

[ adresse1 [,adresse2] ] action [ arguments ]

 

Les crochets indiquent un aspect facultatif et n’apparaissent pas dans les commandes. Tous ces éléments ne sont séparés par aucun espace. En l’absence d’adresses de sélection, l’action a lieu sur toutes les lignes des fichiers d’entrée. L’action par défaut est d’afficher la ligne sur la sortie standard.

L'option -n permet de supprimer cette sortie systématique des lignes.

 

Une adresse peut être, entre autres :

- Un numéro de ligne

- Le caractère $ désignant la dernière ligne

- Le caractère . ( point ) désignant la ligne courante

- Une expression littérale ou régulière entre deux caractères /

 

Quelques actions usuelles

d

 Ne pas afficher la ligne

p

 Afficher la ligne ( s’utilise souvent avec l'option -n )

q  

Abandonner le traitement

s/expr1/expr2/

 Remplacer la première expression par la seconde,une seule fois par ligne

s/expr1/expr2/g 

Remplacer la première expression par la seconde, plusieurs fois par ligne si nécessaire

s/expr1// 

Supprimer l'expression

s/expr1/...&.../ 

Remplacer la première expression par elle-même plus «quelque chose» ( La notation & signifie : «reprendre la première expression» )

Afficher le numéro de ligne

etc...

 

Quelques exemples

sed 's/monsieur/madame/g' fichier  

Remplacer une chaîne par une autre plusieurs fois par ligne

sed 's/^/ /' fichier

 Décaler le début de chaque ligne par des espaces

sed '/./s/^/ /' fichier

 Idem uniquement sur les lignes non vides

sed -n '/expression/!p' fichier Afficher les lignes ne contenant pas l’expression ( Le ! indique la négation de l’expression )
sed -n '20,30p' fichier

 Afficher les lignes de numéro 20 à 30

sed '1,10d' fichier

 Ne pas afficher les 10 premières lignes

sed -n '/./p' fichier  

Afficher uniquement les lignes non vides

sed '/^$/d' fichier

 Même traitement

sed '/expression/q' fichier

 Afficher jusqu’à une expression donnée

sed -n '/expression/=' fichier

 Afficher les numéros des lignes contenant une expression donnée

sed 's/toto/bonjour &/g' fichier

 Remplacer la chaîne «toto» par «bonjour toto»,

 

J. La commande awk

Cet utilitaire awk tire son nom de ceux de ses concepteurs. ( Alfred AHO , Peter WEINBERGER , Brian KERNIGHAN )

C'est un outil très adapté pour réaliser des tâches de manipulation de données sans avoir à les programmer dans un langage classique comme le C. En effet, beaucoup de choses sont implicitement résolues. ( les entrées, la gestion des «champs», la gestion mémoire, les déclarations, les initialisations ... )

 

 

Syntaxe et principe de fonctionnement

awk 'liste-de-commandes' fichiers...

ou

awk -f fichier_commandes fichiers...

 

Une commande est constituée ainsi : motif { action }

Le «motif» sert d’expression de sélection des lignes pour y appliquer l’action associée. Si le motif est absent, toutes les lignes sont concernées par l’action. L’action par défaut consiste à afficher la ligne.

Chaque ligne d'entrée est automatiquement divisée en «champs». Les différents champs sont nommés respectivement : $1 $2 $3 ... $NF

NF représente le nombre de champs de la ligne en cours de traitement. Le séparateur de champs peut être positionné à un caractère particulier.

Pour ce faire, on peut procéder de deux façons :

1) On utilise comme première commande : BEGIN { FS = "caractère" }

ou

2) A l'appel de «awk», on utilise l'option -Fcaractère

 

D’autres variables intéressantes sont prédéfinies :

$0 La ligne entière

NR Numéro de la ligne courante

FILENAME Nom du fichier courant d'entrée

etc...

Les motifs

Les programmes peuvent souvent se résumer à une suite de motifs puisque l'action par défaut est l'impression des lignes sélectionnées.

«awk» est donc un outil très puissant de sélection.

 

Quelques motifs possibles

- Expression bâtie avec des opérateurs très proches de ceux du langage C

$3 < 10

$3 < $2 + 10 && $4 == "dupont"

 

- Expression littérale ou régulière entre deux caractères /

/dupont/

/^[0-9]/

 

- Intervalle de numéros de lignes

NR == 10 , NR == 15

 

- Le motif BEGIN

L’action associée est exécutée avant le traitement des fichiers d’entrée

- Le motif END

L’action associée est exécutée après le traitement des fichiers d’entrée

 

 

Les actions

Une action est une suite d'instructions.

Chaque instruction est terminée par un ; ( point-virgule ) ou un saut de ligne.

Instructions disponibles

- Les fonctions d'affichage «print» ( affichage brut ) et «printf» ( affichage formaté )

- Instruction bâtie avec des opérateurs très proches de ceux du langage C

- Instructions de contrôle ( tests, boucles, fonctions intégrées ... )

 

Quelques exemples

awk ' $3 > 1000 { print $1 , $2 , $3 } ' fichier

 Pour toutes les lignes où le troisième champ est supérieur à mille, on affiche la valeur des trois premiers champs

awk ' { print NR , $0 } ' fichier

 Numéroter les lignes d’un fichier

awk ' { printf "%4d %s\n" , NR , $0 } ' fichier  

Même traitement avec formatage

awk ‘

$3 > 1000 { val++ }

END { print val }

 Afficher le nombre de lignes où le ‘ fichier troisième champ est supérieur à 1000

awk ‘

$3 > max { max = $3 ; maxnom = $2 }

END { print max , maxnom }  

Afficher la valeur maximum ‘ fichier du troisième champ ainsi que celle du deuxième champ associé

awk ‘

{ noms = noms $2 " " }

END { print noms } 

Afficher la concaténation ‘ fichier de tous les deuxièmes champs ( L’espace est l’opérateur de concaténation )

awk ‘

BEGIN { printf "Calcul du maximum et de la moyenne\n" }

{ somme += $3 }

$3 > max { max = $3 }

END { printf "Maximum = %10.2f Moyenne = %10.2f \n" , max , somme / NR }

‘ fichier

 

Commentaires  Forum fermé

Statistiques

Dernière mise à jour

mercredi 4 octobre 2023

Publication

273 Articles
Aucun album photo
Aucune brève
6 Sites Web
2 Auteurs

Visites

11 aujourd’hui
238 hier
828115 depuis le début
2 visiteurs actuellement connectés