Comment utiliser les commandes Linux cat et tac



Les utilitaires de ligne de commande, tels que cat et tac, sont bien plus que de simples outils d’affichage de fichiers texte. Explorez leurs capacités cachées pour améliorer votre productivité sur Linux.

Ces deux commandes, souvent perçues comme basiques, recèlent un potentiel surprenant. Une fois que vous maîtrisez leurs diverses applications, vous constaterez qu’elles peuvent effectuer une part importante du travail lors de la manipulation de fichiers.

La commande cat

cat est généralement utilisée pour visualiser le contenu de fichiers texte, et pour fusionner des parties de fichiers afin de créer un fichier plus grand.

Par le passé, à l’époque des connexions par modem commuté, les fichiers binaires étaient souvent segmentés en plusieurs parties plus petites pour faciliter leur téléchargement. Au lieu de télécharger un seul fichier volumineux, on récupérait chaque fragment séparément. Si un fichier ne se téléchargeait pas correctement, il suffisait de le retélécharger.

Il était donc nécessaire d’avoir un moyen de reconstituer ces fragments en un seul fichier binaire utilisable. C’est ce que l’on appelait la concaténation, et c’est là que cat entrait en jeu, et d’où son nom découle.

Avec l’avènement des connexions à large bande et à fibre optique, cette nécessité s’est estompée. Cependant, cat a encore beaucoup à offrir aujourd’hui.

Afficher un fichier texte

Pour que cat affiche le contenu d’un fichier texte dans une fenêtre de terminal, utilisez la commande suivante :

Assurez-vous que le fichier en question est un fichier texte. Tenter d’afficher un fichier binaire dans le terminal peut entraîner des résultats inattendus, comme un blocage du terminal.

cat poem1.txt

Le contenu de poem1.txt s’affiche alors dans le terminal.

Ceci n’est que la moitié d’un poème. Pour obtenir le reste, nous pouvons utiliser cat pour afficher le contenu de plusieurs fichiers à la fois. Il suffit de lister les fichiers sur la ligne de commande, dans l’ordre souhaité.

cat poem1.txt poem2.txt

C’est mieux, le poème complet est affiché.

Utiliser cat avec less

Le poème est affiché, mais il a défilé trop vite pour pouvoir lire les premiers vers. Pour remédier à cela, nous pouvons rediriger la sortie de cat vers la commande less, qui permet de faire défiler le texte à notre rythme.

cat poem1.txt poem2.txt | less

Nous pouvons maintenant naviguer dans le texte, même s’il est réparti entre deux fichiers.

Numéroter les lignes d’un fichier

cat permet également d’afficher les numéros de ligne. Pour cela, on utilise l’option -n (number).

cat -n poem1.txt

Chaque ligne est numérotée lors de son affichage dans le terminal.

Ne pas numéroter les lignes vides

L’option -n numérote également les lignes vides. Pour ne numéroter que les lignes contenant du texte, utilisez l’option -b (number non-blank).

cat -b poem1.txt

Seules les lignes de texte sont maintenant numérotées.

Ne pas afficher plusieurs lignes vides

Si un fichier contient plusieurs lignes vides consécutives, cat peut être configuré pour n’en afficher qu’une seule. L’option -s (squeeze-blank) permet de supprimer les doublons de lignes vides.

cat -s poem1.txt

Cela n’affecte pas le fichier lui-même, mais uniquement son affichage.

Afficher les tabulations

Pour distinguer les espaces et les tabulations, utilisez l’option -T (show-tabs).

cat -T poem1.txt

Les tabulations sont représentées par la séquence de caractères « ^I« .

Afficher les fins de ligne

Pour visualiser les espaces en fin de ligne, utilisez l’option -E (show-ends).

cat -E poem1.txt

Les fins de ligne sont représentées par le caractère « $« .

Concaténer des fichiers

Il est peu pratique d’avoir un poème divisé en deux fichiers. cat permet de les fusionner en un seul fichier :

cat poem1.txt poem2.txt > jabberwocky.txt

Le fichier jabberwocky.txt contient bien le contenu des deux fichiers source.

Ajouter du texte à un fichier existant

En fait, le poème n’est pas encore complet, il manque le dernier couplet. Le dernier couplet de Jabberwocky est le même que le premier. Pour l’ajouter à la fin de jabberwocky.txt, nous pouvons utiliser cat et l’opérateur >>.

L’opérateur > écrase le fichier, alors que l’opérateur >> ajoute du texte à la fin du fichier.

cat first_verse.txt >> jabberwocky.txt

Toutes les parties du poème sont désormais réunies.

Rediriger l’entrée standard (stdin)

cat peut rediriger l’entrée clavier vers un fichier. Tout ce que vous saisissez est ajouté au fichier, jusqu’à ce que vous appuyiez sur Ctrl+D. Utilisez l’opérateur > pour créer le fichier (ou l’écraser s’il existe déjà).

cat > my_poem.txt

Lewis Carroll se retourne probablement dans sa tombe à cette version improvisée de son poème.

La commande tac

tac est similaire à cat, mais affiche le contenu des fichiers en ordre inverse.

Voyons cela en pratique:

tac my_poem.txt

Le contenu du fichier est affiché dans l’ordre inverse. Dans ce cas, cela n’a pas d’incidence sur la qualité littéraire du poème.

Utiliser tac avec l’entrée standard (stdin)

Si tac est utilisé sans nom de fichier, il fonctionnera avec l’entrée du clavier. La saisie s’arrête avec Ctrl+D, puis tac affiche en ordre inverse tout ce qui a été saisi.

tac

Une fois que Ctrl+D est pressé, l’entrée est inversée et affichée dans le terminal.

Utiliser tac avec les fichiers journaux

Outre les manipulations de texte, tac peut avoir des applications utiles. Par exemple, les fichiers journaux ajoutent généralement les nouvelles entrées à la fin du fichier. En utilisant tac et head, nous pouvons afficher la dernière entrée du fichier.

Nous utilisons tac pour afficher le fichier syslog dans l’ordre inverse, puis nous envoyons le résultat à head. Nous demandons à head de n’afficher que la première ligne qu’il reçoit (qui, grâce à tac, est la dernière ligne du fichier). On obtient ainsi la dernière entrée du fichier syslog.

tac /var/log/syslog | head -1

head affiche la dernière entrée du fichier syslog et se termine.

Notez que head n’affiche qu’une seule ligne, comme nous le lui avons demandé, mais cette ligne est si longue qu’elle est affichée sur trois lignes dans le terminal.

Utiliser tac avec des enregistrements de texte

La dernière fonctionnalité de tac est particulièrement intéressante.

tac fonctionne habituellement sur les fichiers texte en parcourant les lignes de bas en haut. Cependant, on peut définir d’autres délimiteurs. Cela permet de traiter des « blocs » de données d’un fichier texte comme des enregistrements.

Imaginons que nous ayons un fichier journal que nous devons examiner. Regardons son format avec less.

less logfile.dat

Le fichier présente un format répétitif, avec des séquences de trois lignes de valeurs hexadécimales. Chaque séquence de trois lignes hexadécimales est précédée d’une ligne commençant par « = SEQ« , suivie d’un numéro de séquence.

En faisant défiler le fichier, on constate qu’il contient de nombreux enregistrements, le dernier portant le numéro 865.

Imaginons que nous ayons besoin de traiter ce fichier dans l’ordre inverse, enregistrement par enregistrement. L’ordre des lignes hexadécimales doit être conservé.

Les trois dernières lignes du fichier commencent par les valeurs hexadécimales 93, E7 et B8, dans cet ordre.

Utilisons tac pour inverser le fichier, et réduisons la sortie pour plus de clarté.

tac logfile.dat | less

Le fichier est inversé, mais ce n’est pas le résultat souhaité. Nous voulons que l’ordre des lignes de chaque enregistrement soit conservé.

L’ordre des trois dernières lignes hexadécimales, 93, E7 et B8, a été inversé, et les lignes « = SEQ » se retrouvent sous leurs ensembles de lignes hexadécimales.

tac va nous aider :

tac -b -r -s ^=SEQ.+[0-9]+*$ logfile.dat | less

Décortiquons cette commande :

  • L’option -s (séparateur) indique à tac d’utiliser un autre délimiteur que le caractère de fin de ligne habituel.
  • L’option -r (regex) indique à tac de traiter la chaîne de délimiteur comme une expression régulière.
  • L’option -b (before) indique à tac de placer le délimiteur avant chaque enregistrement au lieu de le suivre.

La chaîne -s (séparateur) ^=SEQ.+[0-9]+*$ est interprétée comme suit :

Le caractère ^ représente le début de la ligne. Il est suivi par =SEQ. qui indique la présence de ces trois caractères au début d’une ligne, puis par + qui spécifie « un ou plusieurs caractères », [0-9] qui indique un chiffre, et *$ qui signifie « zéro ou plusieurs caractères jusqu’à la fin de la ligne ».

Nous utilisons le tout avec less.

Le fichier est maintenant affiché dans l’ordre inverse avec les lignes « = SEQ » placées avant leurs blocs de données hexadécimales, et l’ordre des lignes hexadécimales est conservé.

La première valeur des trois premières lignes (qui étaient les trois dernières lignes du fichier original) est bien 93, E7 et B8, dans cet ordre.

C’est tout de même une belle prouesse pour une seule commande !

Tout a une utilité

Dans le monde Linux, même les commandes les plus simples peuvent avoir des fonctionnalités puissantes et insoupçonnées.

La philosophie de conception des utilitaires simples, qui font bien une seule chose et qui interagissent facilement avec les autres, a donné naissance à des commandes telles que tac, qui peut sembler étrange de prime abord, mais qui possède un potentiel inattendu.

Comme le dit une autre philosophie, «Ne méprisez pas le serpent parce qu’il n’a pas de cornes, car qui sait s’il ne deviendra pas un dragon ?»