Expressions régulières

find

La commande find permet de descendre récursivement une série de répertoires en cherchant à appliquer à des fichiers précisés par un ou plusieurs critères de sélection (nom, type, date, ...) une commande donnée.

find [repertoire] [expression]
  • [repertoire] est la liste des répertoires à parcourir

  • [expression] est une suite d'options exprimant à la fois des critères de sélection des fichiers et des actions à leur appliquer. Lorsque le critère est vrai, l'action est exécutée.

Par défaut, la commande find seule parcourt récursivement le répertoire courant à la recherche de tous les fichiers.

option de find signification
-name motif vrai si le motif s'applique au fichier courant
-user nom vrai si le fichier courant appartient à nom
-mtime n vrai si le fichier a été modifié il y a n jours (exactement)
-mtime +n vrai si le fichier a été modifié il y a plus de n jours
-mtime -n vrai si le fichier a été modifié il y a moins de n jours
-newer file vrai si le fichier est plus récent que file
(expression) vrai si expression est vrai
-print toujours vrai, affiche le nom du fichier
-ls toujours vrai, applique la commande ls -l au fichier
-exec command vrai si la commande command délivre un code de retour non nul.
La commande est terminé par le marqueur \;
et le paramètre spécial {} désigne le fichier courant

Les éléments de l'expression peuvent être connectés par les opérateurs suivants, donnés dans l'ordre de priorité décroissante:

  • l'opérateur de négation: !

  • l'opérateur et: la simple juxtaposition des expressions

  • l'opérateur ou: -o

Exemples:

recherche des fichiers f* de moins de 1 jours

find . -name "f*" -mtime -1 -print

A noter la présence de doubles quotes autour de f* pour empêcher l'interprêteur bash d'étendre le * avec les noms de fichiers du répertoire courant. On peut remplacer "f*" par f\*.

changer les droits d'accès à tous les fichiers de plus de 1 jours

find -mtime +1 -exec chmod o-rwx {} \;

grep/egrep/fgrep

UNIX offre trois commandes de la même famille, grep,egrep, et fgrep, pour sélectionner des lignes dans un ou plusieurs fichiers contenant des motifs donnés. Les différences entre les trois commandes se situent dans les options et les algorithmes utilisés.

Synopsis:

grep [option] motif [fichier]
egrep [option] motif [fichier]
fgrep [option] motif [fichier]

Dans fgrep, le motif n'est pas une expression régulière (voir plus loin) mais une chaîne de caractère ordinaire.

Lorsque plusieurs fichiers sont utilisés en argument, le nom des fichiers est placé en préfixe des lignes sélectionnées.

De manière générale, grep est utilisé pour sélectionner les lignes d'un fichier, notamment pour éliminer les informations inintéressantes produites par une commande précédente.

option de grep signification
-n numérote les lignes affichées
-v affiche les lignes qui ne contiennent pas le motif
-c n'affiche que le nombre de lignes qui contiennent le motif
-i ignore la casse (= pas de différence entre majuscules et minuscules)
-l n'affiche que les noms de fichiers renfermant le motif
-s supprime les messages d'erreurs
-e motif permet de rechercher plusieurs motifs ou des motifs commençant par un tiret

selection des atomes dans un fichier PDB

grep ATOM 1DFB.pdb

grep et egrep reconnaissent comme motif des expressions régulières, c'est-à-dire des chaînes de caractères représentant un motif fabriqué à partir de caractères génériques et de caractères spéciaux.

Caractères spéciaux signification validité
. 1 caractère quelconque grep/egrep
[...] 1 caractère parmi une liste de caractère grep/egrep
- placé entre crochets (mais pas en dernière position), sert à définir un intervalle commençant par le caractère précédant et se terminant par le caractère suivant (ex.: [0-9] remplace 0,1,2,3,4,5,6,7,8, et 9 grep/egrep
* le caractère précédent est répété zéro ou plusieurs fois grep/egrep
? le caractère précédent est répété zéro ou 1 fois egrep
+ le caractère précédent est répété 1 ou plusieurs fois egrep
^ placé en début d'expression, indique le début de la ligne grep/egrep
$ placé en fin d'expression, indique la fin de ligne grep/egrep

sed

sed est un éditeur de fichier non interactif qui permet de filtrer et de transformer du texte. Il lit les lignes d'un fichier une à une (séquentiellement) et applique des opérations sur ces lignes.

Synopsis:

sed [-n] [-e requete] [fichier]

sed recopie le ou les fichiers en argument (par défaut, l'entrée standard) dans la sortie standard, en appliquant à chaque ligne les requêtes qui suivent l'option -e (une par -e).

L'option -n demande à sed de n'afficher sur la sortie standard que les lignes sur lesquelles s'applique la requête.

Chaque requête peut porter sur tout ou une partie du fichier. Pour cela, on utilise un adressage:

adressage de sed

[adresse1[,adresse2]]

Par défaut (sans adressage), la requête est appliquée à toutes les lignes du ou des fichiers.

Les adresses sont les numéros absolus des lignes du texte, ou $ pour désigner la dernière ligne, ou une expression régulière placée entre deux barres et définissant un motif figurant dans la ligne adressée.

Si adresse1 est présent seulement, la requête n'est appliquée qu'aux lignes respectant adresse1. Si adresse2 est présent en plus d' adresse1, la requête est appliquée à partir de la ligne respectant adresse1, jusque la ligne respectant adresse2.

Les expressions régulières reconnues par sed sont grosso-modo celle de grep. Il est possible en plus de définir des groupes grâce au parenthésage (...) (voir plus loin).

requête sed action
s/motif1/motif2/option remplace le motif1 par le motif2. L'option g applique le remplacement pour toutes les occurences de motif1 dans la ligne. L'option p demande à afficher la ligne si un remplacement a eu lieu.
p affiche la ligne
d détruit la ligne

Exemple:

fichier de données initial

Mitterand Francois
Chirac Jacques
Sarkozy Nicolas

code sed pour inverser prenom et nom

sed -e '1,$s/^\([A-Za-z]*\)  *\([A-Za-z]*\)$/\2 \1/' nom.txt

awk

But

awk est un outil non interactif pour traiter des textes: les transformer, les éditer, faire des calculs élémentaires sur leur contenu. Il manipule les fichiers ligne par ligne et adresse les champs à l'intérieur des lignes.

Principe de fonctionnement

awk fonctionne sur le même principe que l'éditeur sed: le ou les fichiers à traiter sont pris ligne par ligne, et chaque ligne est soumise au programme awk; si la ligne courante satisfait à une ou plusieurs sélections proposées dans le programme, les actions correspondantes sont exécutées.

Une ligne du programme awk a le format:

selection {action}

Un prologue (sélection BEGIN) et un épilogue (sélection END) permettent d'initialiser et de conclure des calculs sur les lignes des fichiers.

Une sélection est une expression régulière placée entre deux barres obliques, ou une expression plus complexe; une action est une instruction du langage. En l'absence de sélection, toutes les lignes du fichier sont concernées; en l'absence d'action, la ligne est imprimée.

Appel

awk [ -Fc ] { -f fprog | prog } [ param ] [ fichier ]

Sans fichier, awk travaille sur l'entrée standard. S'il y a plusieurs fichiers, ils sont traitées en séquence (un tiret remplace alors l'entrée standard).

L'option -F indique quel est le séparateur des champs (par défaut le blanc et la tabulation).

Le "programme" awk peut être dans la ligne de commande (argument prog) ou dans le fichier fprog de l'option -f.

Les variables

Un programme awk manipule trois sortes de variables:

  • les variables prédéfinies

  • les variables qui désignent les champs de la ligne en cours de traitement

  • les variables de travail qui sont nécessitées par les actions

Il y a sept variables prédéfinies:

variable signification
FILENAME contient le nom du fichier en cours de traitement
NF contient le nombre de champs de la ligne courante
NR contient le numéro de la ligne courante
FS contient le caractère qui est de séparateur de champ sur les lignes d'entrée
OFS contient le caractère qui sert de séparateur de champ en affichage (blanc par défaut)
RS contient le caractère qui sert de séparateur de ligne (NL par défaut)
ORS contient le caractère qui sert de séparateur de ligne en affichage (défaut ORS=RS)

Les variables qui désignent les champs d'une ligne sont $1,$2, ... jusqu'à $(NF). La variable $0 désigne la ligne courante elle-même.

Les variables de travail sont désignées par des identificateurs; elles ne se déclarent pas et sont du type chaîne. Elles sont initialisées par défaut à la chaîne nulle. Si le contexte l'exige, une variable sera considérée comme numérique (nombre à virgule flottante), et initialisée par défaut à zéro.

On peut aussi utiliser des variables tableaux (ou dictionnaires) qui ne se déclarent pas, et dont l'expression d'indice est quelconque (peut être une chaîne). Les crochets autour de l'indice indiquent qu'il s'agit d'un tableau.

Le # initialise un commentaire qui se termine en fin de ligne.

Les sélections

Trois formes possibles:

pas de sélection = toute ligne est sélectionnée pour cette action
condition les lignes pour lesquelles condition est satisfait sont sélectionnées
cond1, cond2 sont sélectionnées: la ligne pour laquelle cond1 est satisfait, et toutes les lignes qui suivent, jusqu'à la ligne pour laquelle la seconde condition cond2 est satisfaite.

Une condition est soit une expression régulière entourée de barres obliques, soit une expression booléenne, dont les termes sont combinés avec les opérateurs et (&&), ou (|) et non (!). Un terme booléen utilise les opérateurs relationnels suivants:

opérateur signification
== égalité
!= différence
<, <= inférieur, inférieur ou égal
>, >= supérieur, supérieur ou égal
~ est contenue dans
!~ n'est pas contenue dans

Une expression régulière dans awk peut contenir les extensions suivantes:

  • |: ou entre deux expressions régulières

  • +: une ou plusieurs occurences de l'expression régulière précédente (au moins une)

  • ?: zéro ou une occurrence de l'expression régulière précédente (au plus une)

  • *: zéro ou plusieurs occurences de l'expression régulière précédente

Les actions

[ BEGIN { actions } ] [ sélection { actions } ] [ END { actions } ]

Les actions sont composées d'une suite d'instructions séparées par:

  • une fin de ligne

  • un point-virgule

  • une accolade fermante

Affectation

variable = expression
+, -, *, /, % addition, soustraction, multiplication, division, reste
++, -- opérateurs incrémentation et décrémentation
+=, -=, *=, /=, %= opérateurs d'affectation

On peut affecter n'importe quelle variable, même une variable qui désigne un champ.

Affichage

Commandes:

print affichage d'une liste d'expressions séparée par des virgules
printf format affichage formaté d'une liste d'expressions séparée par des virgules

Le format est une chaîne qui a la même syntaxe qu'en C.

Conditionnelle

if (condition) {instruction} [ else {instruction} ]

Itération

while (condition) {instruction}
for (expression ; condition ; expression ) instruction
for ( i in tableau ) instruction

Autres structures de contrôle

break sortie d'une boucle
continue quitter l'itération en cours
next quitte le traitement de la ligne courante
exit quitte le traitement en cours (exécute l'épilogue s'il existe)