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.