Caractères, filtres et regexCette page explique comment manipuler les chaines de caractères et le contenu des fichiers à l'aide des commandes de base et des filtres

Manipulations simples

Taille d'une chaine de caractères

Pour connaître la taille d'une variable, on utilise ${#variable}

chaine=abc
echo ${#chaine}
3

Extraire une sous chaine

Pour extraire des éléments d'une chaine de caractères, on utilise la commande cut. Cette commande lit les données à modifier dans l'entre standard et les affiche dans la sortie standard, elle ne peut donc être utilisée qu'avec des redirections de l'entrée standard ou des pipes.

Pour extraire un caractère, on utilise l'option -c

echo abcdef | cut -c2
b

On peut également extraine une sous chaine de la manière suivante :

echo abcdef | cut -c2-5
bcde

Extrait les caractères 2 à 5 de la chaine.

Remplacer des caractères

La commande tr permet de remplacer un caractère par un autre. Cette commande ne fonctionne qu'avec des redirections ou des pipe

echo abc | tr 'a' 'b'
tr 'a' 'b' < /fichier.txt

Il est possible de remplacer plusieurs caractères à la fois :

echo abccba | tr 'abc' 'def'
deffed

remplace a par d, b par e et c par f.

Attention, tr ne remplace que des caractères et ne peut pas remplacer des mots entier, pour remplacer des mots, on utilisera la commande sed ou awk qui prennent en entrée des expressions régulières.

Supprimer des caractères

La commande tr permet également de supprimer des caractères en utilisant l'option -d. Par exemple :

echo abc | tr -d 'a'
bc
Expressions régulières

Notion d'expression régulière

Une expression régulière ou rationnelle est une chaine de caractères qui décrit un ensemble de chaines de caractères. Par exemple l'expression régulière [0-9][a-z] décrit l'ensemble des chaines de caractères composés d'un chiffre et d'une lettre.

Les expressions régulières ont de nombreuses utilités en informatique, elles servent principalement pour réaliser :

  • des filtres : ne conserver que certaines lignes d'un fichier texte : par exemple que les lignes de la forme variable=valeur.
  • des contrôles : vérifier qu'une donnée entrée par un utilisateur a bien le format d'une adresse ip par exemple.
  • des substitutions : remplacer un motif par une chaine de caractères précise : par exemple, remplacer les majuscules par des minuscules.
  • des découpages : récupérer une partie d'une chaine de caractères ou bien découper une ligne par rapport aux « ; » dans le cas d'un fichier .csv.

Créer une expression régulière

Pour décrire une chaine de caractère, on utilise un langage qui est décrit ci-dessous.

Les caractères

  • X : Le caractère X
  • \\ : Le caractère \
  • \t : Le caractère tabulation
  • \n : Le caractère nouvelle ligne
  • \r : Le caractère retour chariot
  • \f : Le caractère saut de page
  • . : Un caractère quelconque

Exemple : AB\tCD\n. Cette expression régulière représente la chaine de caractère AB suivi d'une tabulation suivi de CD suivi d'un saut de ligne.

Les classes de caractères

  • [abc] : Les caractères a, b ou c
  • [^abc] : Les caractères qui ne sont pas a, b ou c
  • [a-zA-Z] : Un caractère de a à z minuscule ou majuscule
  • [A-Z] : une majuscule
  • [a-z] : une minuscule
  • [0-9] : Un caractère numérique

Exemple : [0-9][a-z]. Cette expression régulière représente une chaine de caractères constituée d'un chiffre puis d'une lettre.

Il faut noter qu'il existe une différence entre ab qui représente la chaine de caractère ab de [ab] qui représente soit la chaine de caractère "a" soit la chaine de caractères "b".

Les caractères de répétition

  • X* : X zéro ou plusieurs fois

Opérateurs logiques

  • XY : X suivi de Y
  • X|Y : X ou Y
Le filtre grep

Présentation

Les commandes grep, egrep, fgrep recherches dans des fichiers en entrée des lignes contenant un motif donné (une chaine de caractère ou une expression régulière)

  • Si ce motif est trouvé, la ligne est affichée et il n'est pas affiché sinon.
  • Si le motif est trouvé alors le code retour de grep est 0 sinon, ce code retour est 1.

Les options principales :

  • -v affiche uniquement les lignes qui ne correspondent pas au motif
  • -f le mot suivant est un fichier qui contient le motif
  • -h n'affiche pas le nom du fichier
  • -i ignore la casse
  • -q supprime l'affichage
  • -x Affiche uniquement les lignes pour lesquelles le motif décrit toute la ligne

Cette commande valorise le code retour : Si le motif a été trouvé alors le code retour est 0 et le code retour est 1 si le motif n'a pas été trouvé. Sauf dans le cas où on utilise l'option -v qui inverse la séléction, dans ce cas, le code retour est 0 si le motif n'a pas été trouvé et 1 si le motif a été trouvé.

Syntaxe

La commande grep utilise les expressions régulières. Pour préciser qu'on utlise les expressions régulières étendues, un utilise l'option -E. Pour préciser qu'on ne souhaite pas utiliser les expressions régulières, on utilise l'option -F, dans ce cas, le motif sera traité comme une chaine de caractères.

grep -options 'motif' fichier1 fichier2
grep -options 'motif' < fichier

Exemples

Affichage des lignes qui commencent par un chiffre

grep '^[0-9]' < fichier

La commande grep peut également être utilisée avec un pipe pour réaliser un filtre sur les résultats d'une commande. Par exemple, pour lister les fichier qui ont été modifiés en 2012, on peut utiliser la commande ls -l suivi d'un grep :

ls -l | grep '2012'
drwx------  1 K0B6QU  Utilisa. du domaine  0 Apr  2  2012 WINDOWS

Ou par exemple pour supprimer la ligne des titres de la commande ps :

ps | grep -v "PID"
  4733 n00 0:00.07 ps
  5877 n00 0:00.05 grep
  6193 n00 0:01.04 ksh
Le filtre sed

sed est un éditeur de texte non interactif qui utilise les expressions régulières. Cette commande lit les fichiers dans l'entrée standard et les affiche dans la sortie standard (c'est un filtre).

Syntaxe

La syntaxe de la commande est la suivante :

sed [-n] [ -e commande_sed ] [-f fich_commande] liste fichiers

Les options sont :

  • -n supprime l'affichage
  • -e permet d'ajouter une commande d'affichage sed
  • -f spécifie un fichier qui contient les commandes d'affichage de sed

Les commandes sed

Les commandes sed respectent la syntaxe suivante :

adressage/fonction/argument

Adressage des lignes

L'adressage des lignes permet de définir sur quelles lignes le traitement va s'exécuter.

  • 10 : la ligne 10
  • /mot cle/ : le traitement portera sur toutes les lignes contenant le mot clé
  • /expression regulière/ : le traitement portera sur toutes les ligne qui matchent la regex
  • adresse1,adresse2 : le traitement portera sur la première ligne répondant vrai à adresse1 jusqu'à la première ligne répondant vrai à adresse2

Fonctions

Fonctions portant sur la ligne entière

  • d : Supprime les lignes adressées
  • a\texte : fait suivre la ligne adressée du texte
  • i\texte : fait précéder la ligne adressée du texte
  • c\texte : substitue les lignes adressées par le texte

Modification des chaines de caractère

La fonction de substitution s exige un séparateur qui encadre l'expression et son remplacement. Le séparateur est le premier caractère qui suit s dans la commande. Si les adresses ne sont pas composées de chaines de caractères alors elles sont également encadrées par ce séparateur. Le séparateur ne peut être ni un espace ni un passage à la ligne ni un caractère utilisé dans l'expression ou son remplacement ou les adresses.

Enfin, il faut ajouter un argument à la fonction s qui indique sur quelles occurrences sera exécuté le traitement :

  • g : toutes les occurrences
  • n : seule la première occurrence de la ligne

Par exemple, pour remplacer toutes les occurrences de mot1 par mot2, on utilise :

echo "mot1 mot3 mot1" | sed 's/mot1/mot2/g'
mot2 mot3 mot2

Pour ne remplacer que la première occurrence :

echo "mot1 mot3 mot1" | sed 's/mot1/mot2/'
mot2 mot3 mot1
Le filtre awk

AWK est un langage interprété qui est en mesure de remplacer avantageusement certains scripts Shell pour exécuter une même action. En revanche, awk ne peut pas communiquer avec le noyau du système. AWK travaille sur le contenu de fichiers ligne par ligne.

Syntaxe d'appel

Pour lancer un programme awk, on tape la commande suivante :

awk '{instructions}' < fichier.txt

Elaboration d'un script awk

Structure d'un script awk

Un script awk est constitué de la manière suivante :

BEGIN {
	// Opérations effectuées avant la lecture du fichier
} 
{
	// Opérations effectuées sur chaque ligne du fichier
}
/motif/{
	// Opérations effectuées pour les ligne suivant lemotif
}
END {
	// Opérations effectuées après la lecture du fichier
}

Les blocs BEGIN et END sont optionnels.

5.2.2 Les enregistrements et les champs

AWK a une vision tabulaire du fichier de données qui est alors organisé en lignes et en colonnes. La ligne est un enregistrement (record) qui est organisée en champs (fields). Les champs sont référencés par des variables internes au mécanisme AWK.

  • $0 Désigne tout l'enregistrement
  • $1 Mis pour le premier champ de la ligne courante.
  • $2 Mis pour le second champ de la ligne courante.
  • $NF Mis pour le dernier champ de la ligne courante

Les variables awk

Les affectations de variables se font comme en bash:

variable1=2
variable_2="Hello world"
variable_3=1.56

Pour récupérer le contenu d'une variable, on la préfixe de $ comme en bash : $variable sera remplacé par la valeur de variable.

Il existe un certain nombre de variables prédéfinies :

  • ARGC Cette variable contient le nombre d'arguments provenant de la ligne de commande. Les options au programme gawk ne sont pas prises en compte.
  • ARGIND Cette variable permet de connaître quel fichier est en cours en traitement en contenant l'indexe de ARGV.
  • ARGV Ce tableau contient les arguments de la ligne de commande. Il est indexé de 0 à ARGC - 1.
  • FILENAME La variable contient le nom du fichier en cours de traitement. Si aucun fichier n'est spécifié alors FILENAME contient '-' et l'entrée standard est utilisée. FILENAME n'est pas encore défini dans les blocs BEGIN.
  • FNR La variable contient le numéro de l'enregistrement pour le fichier courant.
  • FS contient la chaîne permettant la séparation des champs. FS peut contenir une expression régulière.
  • IGNORECASE Cette variable permet de contrôler la casse pour les expressions régulières et les opérations sur les chaînes. Si IGNORECASE contient une valeur différente de 0 alors la casse n'est plus prise en compte.
  • NF La variable contient le nombre de champs pour un enregistrement. (Les champs sont séparés par des espaces et tabulations)
  • NR contient le nombre total d'enregistrements depuis le début du script.

Structure conditionnelle

La boucle Si s'utilise de la manière suivante :

if (condition){
	instructions
}
else {
	instructions
}
Les opérateurs

Les opérateurs de comparaison :

  • == égale à
  • != différent de
  • <= inférieur ou égale à
  • >= supérieur ou égale à
  • < inférieur à
  • > supérieur à

Les opérateurs logiques :

  • && Le ET-Logique
  • || Le OU-Logique
  • ! La Négation

Les opérateurs arithmétiques :

  • + Addition
  • - Soustraction
  • * Multiplication
  • / Division
  • % Modulo (reste d'une division entière)
  • ^ Puissance

Boucle for

La syntaxe de la boucle est la suivante :

for (i=debut; i<fin; i++)
{
	instructions
} 

Boucle while

La syntaxe de la boucle est la suivante :

while (condition)
{
	instructions
}

Les fonctions

Fonctions numériques
  • atan2(y,x) arctangente de x/y en radians dans l'intervalle -pi pi
  • cos(x) cosinus (en radians)
  • exp(x) exponentielle e à la puissance x
  • int(x) valeur entière
  • log(x) logarithme naturel
  • rand() nombre aléatoire entre 0 et 1
  • sin(x) sinus (en radians)
  • sqrt(x) racine carrée
  • srand(x) réinitialiser le générateur de nombre aléatoire
Les fonctions sur les chaines de caractères

s et t représentent des chaines de caractères, r une expression régulière, i et n des entiers

  • gsub(r,s,t) sur la chaine t, remplace toutes les occurrences de r par s
  • index(s,t) retourne la position la plus à gauche de la chaine t dans la chaine s
  • length(s) retourne la longueur de la chaine s
  • match(s,r) retourne l'index ou s correspond à r et positionne RSTART et RLENTH
  • split(s,a,fs) split s dans le tableau a sur fs, retourne le nombre de champs
  • sub(r,s,t) comme gsub, mais remplace uniquement la première occurrence
  • substr(s,i,n)retourne la sous chaine de s commençant en i et de taille n
Les fonctions d'affichage
  • print(s) affiche la chaine de caractères s
  • printf(r, s) affiche des données de manière formatées. Le premier argument permet de définir le format de la chaine de la chaine de caractères.
    • %s signifie une chaine
    • %n un entier
    • %d un décimal
    • Les arguments suivants servent à valoriser les %x

Par exemple : printf('1:%s\n2:%s', a, b) affichera 1:a puis 2:b sur une autre ligne. sprintf(r, s) comme printf sauf que son résultat peut être affecté à une variable.