Manipulation du dataflow

Partie 1 / Chapitre 3 : Manipulation du dataflow

Dans ce nouveau chapitre, nous allons explorer comment manipuler les flux de données en ligne de commande sous Linux. Comme nous l’avons vu en introduction, « dataflow » désigne le flux d’informations qui circule entre les commandes et les fichiers.

Contrairement à une interface graphique où tout est visuel, en CLI, les données sont traitées comme des flux textuels que l’on peut rediriger, filtrer et transformer. C’est l’un des points forts du shell : on peut enchaîner des commandes simples pour créer des traitements puissants.

Manipulation avancée des fichiers

Le pipe (« tuyau » en anglais), est représenté par le symbole |. C’est un outil fondamental en Bash : il permet de prendre la sortie standard d’une commande et de l’envoyer en tant qu’entrée à une autre commande. C’est comme un tuyau qui relie des outils entre eux, évitant d’écrire des fichiers intermédiaires. Cela rend les opérations plus efficaces et fluides.

Par exemple, imaginez que vous voulez lister les fichiers d’un dossier et compter combien il y en a. Avec un pipe, nous écrirons : ls | wc -l. Ici, lsliste les fichiers (sa sortie standard), et wc -l compte les lignes de cette sortie.

D’autres commandes sont également très utiles.

grep : C’est un filtre puissant pour rechercher des motifs dans du texte. Il lit l’entrée (un fichier ou un flux) et n’affiche que les lignes qui correspondent à un pattern. L’option -v inverse la recherche (affiche ce qui ne correspond pas), -iignore la casse (la distinction entre majuscules et minuscules), et -r cherche récursivement dans les dossiers.

Par exemple, pour trouver toutes les lignes contenant “erreur” dans un fichier de logs : grep "erreur" /var/log/syslog. Histoire de donner un exemple avec le pipe, nous pouvons également écrire : cat /var/log/syslog | grep "erreur" (même résultat, mais en lisant le fichier via cat).

sort permet de trier les lignes d’un flux ou d’un fichier par ordre alphabétique (par défaut) ou numérique (avec l’option -n ). -r inverse l’ordre des résultats. Par exemple, ls /bin | sort trie la liste des binaires.

uniq supprime les lignes dupliquées consécutives d’un flux trié. L’option -c compte les occurrences.

Si on repart d’un cas d’usage vu plus tôt, pour retrouver les erreurs dans les logs, on peut par exemple compter le nombre d’erreurs d’un type donné. Par exemple, les programmes utilisent souvent la syntaxe [error] suivi d’un code d’erreur standard (et parfois une description) pour désigner leurs erreurs. On peut alors lister les types d’erreurs rencontrées par un tel programme avec une commande du style : cat /var/log/some-program | grep "[error]" | sort | uniq

Nous voyons par la même occasion qu’il est possible de chaîner les appels avec |.

Dans les arguments de toutes ces commandes, nous pouvons noter quelques récurrences :

  • -r peut être compris comme « récursif » ou bien « reverse » ;
  • -iindique souvent d’ignorer la casse ;
  • -h ou -H permet d’afficher l’aide (« help ») ;
  • pour -v grep est en fait l’exception qui confirme la règle : la plupart du temps, il est utilisé pour afficher directement les logs de l’exécutable (« verbose »).

Les couteaux suisses du traitement de texte

cut, awk et sed sont des outils nettement plus avancés que les précédents. Ils sont également disponibles en standard sur toute distribution Linux qui se respecte, et deviennent vite incontournables, quand nous passons le plus clair de notre temps dans le terminal. Vous pouvez penser à eux comme des éditeurs automatisés : ils lisent ligne par ligne et appliquent des règles, pour extraire ou modifier des données sur la sortie standard d’une commande, ou bien dans un fichier.

cut permet d’extraire des sections spécifiques d’un fichier, comme des colonnes, sur la base d’un délimiteur. Celui-ci est par défaut un espace, mais avec l’option -d nous pouvons le modifier (par exemple, utiliser ; pour certains fichiers csv).

Par exemple, pour un fichier players.csv qui contient les utilisateurs suivants :

alice;25
bob;30

Nous pouvons utiliser cut -d',' -f1 players.csv pour afficher les noms des joueurs.

awk est une commande, mais aussi un langage de traitement de texte. Il excelle pour les données tabulées (comme des CSV) : Il divise chaque ligne en champs (séparés par espaces ou tabulations par défaut) et permet des opérations comme des calculs ou des conditions.

Pour un usage basique, la syntaxe est la suivante : awk 'pattern { action }' file.

Supposons par exemple un fichier scores.txtavec “Alice 85\nBob 92\nCharlie 78”.

Pour afficher seulement les noms nous pourrons utiliser : awk '{ print $1 }' scores.txt (affiche Alice, Bob, Charlie).

sed, pour « Stream EDitor », permet, comme son nom l’indique, d’éditer des flux en remplaçant, supprimant ou insérant du texte. En général, la syntaxe qu’on pourra utiliser sera de la forme suivante : sed 's/motif/remplacement/' some-file (le s pour substitute). Le motif est traité comme une expression régulière. Ceux-ci pourraient mériter un cours à part entière. À notre niveau, notez que ce peut être juste une chaîne de caractères, ou une expression avec quelques caractères pouvant jouer un rôle spécial (comme le point .pour signifier « n’importe quel caractère », les crochets [ ] pour lister des caractères possibles, etc.).

On l’utilise parfois pour supprimer les lignes vides d’un fichier : sed '/^$/d' fichier.txt (le d est ce qu’on appelle un « flag », celui-ci indique qu’on veut supprimer ce que l’expression régulière a trouvé).

Nous pouvons combiner ces outils avec des pipes. Par exemple, pour extraire et trier les adresses IP d’un programme d’authentification : grep "IP" /var/log/auth.log | cut -d' ' -f10 | sort | uniq.

Contrôles des flux standards

Comme vu en introduction, chaque commande sous Linux a trois flux principaux : stdin (entrée standard), stdout (sortie standard) et stderr (sortie d’erreurs). Nous avions également parlé de la possibilité de les rediriger : ce peut être pour écrire dans des fichiers, ou pour les fusionner.

  • > : Redirige stdout vers un fichier. Exemple : ls > liste.txt écrit la liste de fichier dans liste.txt. Suivant la configuration du système, si le fichier existe déjà, il pourra soit l’écraser, soit renvoyer une erreur d’écriture. Il faut donc être très prudent, dans son usage.
  • >> : Ajoute à la fin d’un fichier sans écraser. Par exemple : echo "Nouvelle ligne" >> liste.txt (echo permet d’afficher du texte ou le contenu d’une variable dans le terminal, donc sur la sortie standard).
  • 2> some-file.log , 2>&1 et &> sont des cas d’usage très courant, et donc très important à connaître. 2> redirige stderr vers un fichier, 2>&1 redirige stderr vers stdout, et enfin, &> permet de réaliser les deux opérations en une seule (tous les logs, erreur et standard, iront vers le fichier ciblé).

Un cas d’usage courant est d’ignorer les erreurs de notre commande aveccommande 2>/dev/null ( /dev/null est un fichier un peu particulier, qui se comporte comme un trou noir qui avale les données qu’il reçoit).

Un dernier exemple complet, pour trier des logs et écrire les résultats, en ignorant les erreurs de grep : grep "erreur" log.txt | sort > erreurs_triees.txt 2>/dev/null.

Ces redirections sont cruciales pour les scripts, car elles permettent de logger les outputs sans polluer le terminal.

image


Exercices

Exercice n°1

Débutant

L’IA vous suggère d’utiliser ls | wc -l. Expliquez ce que fait le symbole | dans cette commande.

Exercice n°2

Débutant

Vous voulez enregistrer le résultat de la commande date dans un fichier nommé logs.txt sans effacer ce qui est déjà dedans. Quelle redirection utiliser ?

Exercice n°3

Débutant

L’IA vous propose grep "erreur" fichier.log. Que fait cette commande ?

Exercice n°4

Confirmé

L’IA vous propose de rediriger la sortie d’erreur de votre programme vers un fichier avec 2>. Cependant, vous vous rendez compte que le message d’erreur ne fournit pas assez de détails, et l’IA n’est pas capable de vous assister. Que pouvez-vous faire de plus ?

Exercice n°5

Confirmé

Comment rediriger à la fois les messages normaux et les erreurs d’une commande vers un seul fichier tous_les_logs.txt ?

Exercice n°6

Confirmé

Une IA vous suggère command 2>/dev/null. Que se passe-t-il pour les messages d’erreur ?

Exercice n°7

Avancé

Vous avez une liste de noms désordonnée avec des doublons. Quelle combinaison de commandes permet d’obtenir une liste triée et unique ?

Exercice n°8

Avancé

Expliquez l’intérêt de l’option -v de la commande grep.

Exercice n°9

Avancé

L’IA vous propose cette commande complexe : grep "erreur" log.txt | sort > erreurs_triees.txt 2>/dev/null. Expliquez chaque étape.

Exercice n°10

Expert

Pourquoi est-il risqué d’utiliser > sur un fichier important sans vérification préalable ?

Exercice n°11

Expert

Comment extraire les 5 premières lignes d’un fichier après l’avoir trié par ordre alphabétique ?

Exercice n°12

Expert

Un script IA utilise cat fichier.txt | grep "pattern". Pourquoi un « vrai » utilisateur Linux préférera-t-il grep "pattern" fichier.txt ?


Conclusion

Avec ce nouveau chapitre, nous avons couvert la majeure partie des sujets liés à la vie dans le terminal.

Tout couvert ? Non, il reste encore un dernier sujet, plus avancé, mais également très intéressant : La gestion des processus.


Réponses aux exercices

Exercice n°1

Le pipe redirige la sortie standard de ls (la liste des fichiers) vers l’entrée standard de wc -l (qui compte les lignes).

Exercice n°2

Il faut utiliser >> : date >> logs.txt.

Exercice n°3

Elle recherche et affiche uniquement les lignes contenant le mot « erreur » dans le fichier fichier.log.

Exercice n°4

Vous pouvez utiliser>, qui redirige la sortie standard (stdout) ; là où 2> redirige la sortie d’erreur (stderr).

Exercice n°5

Avec la redirection &> : commande &> tous_les_logs.txt. Cela agrège la sortie standard et la sortie d’erreur, vers le fichier indiqué.

Exercice n°6

Ils sont envoyés vers /dev/null, un « trou noir » virtuel qui supprime les données reçues. Les erreurs sont donc ignorées et n’apparaissent pas à l’écran.

Exercice n°7

sort liste.txt | uniq.

Exercice n°8

Elle inverse la recherche : elle affiche toutes les lignes qui ne contiennent pas le motif recherché.

Exercice n°9

  1. grep cherche « erreur » dans log.txt.
  2. Le pipe | envoie le résultat à sort.
  3. sort trie les lignes.
  4. > enregistre le résultat trié dans erreurs_triees.txt.
  5. 2>/dev/null ignore les erreurs éventuelles de la commande grep. (qui seraient autrement enregistrées danserreurs_triees.txt).

Exercice n°10

Parce que > écrase le contenu du fichier s’il existe déjà. S’il s’agit d’une erreur de l’IA, vous perdrez vos données sans avertissement.

Notez que certains systèmes préviennent ce comportement, mais il ne vaut mieux pas compter là-dessus par défaut (prudence est mère de sûreté).

Exercice n°11

sort fichier.txt | head -n 5.

Exercice n°12

Pour éviter une commande inutile (cat) et un pipe superflu. C’est plus efficace en ressources et plus élégant, respectant la simplicité Unix.

Write a comment
No comments yet.