Comment utiliser les commandes Linux cat et tac

Les commandes cat et tac affichent le contenu des fichiers texte, mais il y en a plus que ce que vous voyez. Plongez un peu plus en profondeur et apprenez quelques astuces productives en ligne de commande Linux.

Ce sont deux petites commandes simples, souvent rejetées comme étant juste cela – trop simples pour être d’une utilité réelle. Mais une fois que vous connaissez les différentes façons dont vous pouvez les utiliser, vous verrez qu’ils sont parfaitement capables de faire leur juste part du gros du travail lorsqu’il s’agit de travailler avec des fichiers.

La commande du chat

le chat est habitué à examiner le contenu des fichiers texteet pour joindre des parties de fichiers ensemble pour former un fichier plus volumineux.

À un moment donné – à l’époque de la connexion commutée modem– les fichiers binaires étaient souvent divisés en plusieurs fichiers plus petits pour faciliter le téléchargement. Au lieu de télécharger un gros fichier, vous avez retiré chaque fichier plus petit. Si un seul fichier ne parvient pas à se télécharger correctement, vous récupérez simplement ce fichier à nouveau.

Bien sûr, vous aviez alors besoin d’un moyen de reconstituer la collection de fichiers plus petits en un seul fichier binaire de travail. Ce processus s’appelait concaténation. Et c’est là que le chat est entré et d’où il tire son nom.

Les connexions à large bande et à fibre ont fait disparaître ce besoin particulier – tout comme les sons criards des commutateurs téléphoniques – alors que reste-t-il à faire pour chat aujourd’hui? Beaucoup en fait.

Affichage d’un fichier texte

Pour que chat répertorie le contenu d’un fichier texte dans une fenêtre de terminal, utilisez la commande suivante.

Assurez-vous que le fichier est un fichier texte. Si vous essayez de lister le contenu d’un fichier binaire dans la fenêtre du terminal, les résultats seront imprévisibles. Vous pourriez vous retrouver avec une session de terminal verrouillée ou pire.

cat poem1.txt

cat poem1.txt dans une fenêtre de terminal

Le contenu du fichier poem1.txt est affiché dans la fenêtre du terminal.

le contenu de poem1.txt dans une fenêtre de terminal

Ce n’est que la moitié du célèbre poème. Où est le reste? Il y a un autre fichier ici appelé poem2.txt. Nous pouvons faire lister à chat le contenu de plusieurs fichiers avec une seule commande. Tout ce que nous devons faire est de lister les fichiers dans l’ordre sur la ligne de commande.

cat poem1.txt poem2.txt

cat poem1.txt poem2.txt dans une fenêtre de terminal

Cela semble mieux; nous avons tout le poème maintenant.

contenu de poem1.txt et poem2.txt dans une fenêtre de terminal

Utiliser un chat avec moins

Le poème est tout là, mais il a dépassé la fenêtre trop vite pour lire les premiers versets. Nous pouvons canaliser la sortie de cat en moins et faire défiler le texte à notre propre rythme.

cat poem1.txt poem2.txt | less

chat poem1.txt poem2.txt | moins dans une fenêtre de terminal

Nous pouvons maintenant avancer et reculer dans le texte dans un flux, même s’il est conservé dans deux fichiers texte distincts.

  Comment désactiver les suggestions de recherche dans Firefox

contenu de poem1.txt et poem2.txt en moins dans une fenêtre de terminal

Numérotation des lignes dans un fichier

Nous pouvons avoir le numéro de chat des lignes dans le fichier tel qu’il est affiché. Pour ce faire, nous utilisons l’option -n (nombre).

cat -n poem1.txt

cat -n poem1.txt dans une fenêtre de terminal

Les lignes sont numérotées telles qu’elles sont affichées dans la fenêtre du terminal.

contenu de poem1.txt avec des lignes numérotées dans une fenêtre de terminal

Ne numérotez pas les lignes vides

Nous avons réussi à numéroter les lignes par chat, mais les lignes vides entre les vers sont également comptées. Pour avoir les lignes de texte numérotées mais pour ignorer les lignes vides, utilisez l’option -b (nombre non vide).

cat -b poem1.txt

cat -b poem1.txt dans une fenêtre de terminal

Maintenant, les lignes de texte sont numérotées et les lignes vides sont ignorées.

lignes numérotées sautant les blancs l; ines dans une fenêtre de terminal

Ne pas afficher plusieurs lignes vides

S’il y a des sections de lignes vierges consécutives dans un fichier, nous pouvons demander à cat d’ignorer toutes les lignes vides sauf une. Regardez ce fichier.

contenu d'un fichier avec des lignes vierges consécutives dans une fenêtre de terminal

La commande suivante fera afficher à chat une seule ligne vide de chaque groupe de lignes vides. L’option dont nous avons besoin pour y parvenir est l’option -s (squeeze-blank).

cat -s poem1.txt

cat -b poem1.txt dans une fenêtre de terminal

Cela n’affecte en aucune façon le contenu du fichier; cela change simplement la façon dont cat affiche le fichier.

Plusieurs lignes vides ignorées dans une fenêtre de terminal

Afficher les onglets

Si vous voulez savoir si les espaces sont causés par des espaces ou des tabulations, vous pouvez le découvrir en utilisant l’option -T (show-tabs).

cat -T poem1.txt

cat -T poem1.txt dans une veuve terminale

Les onglets sont représentés par les caractères «^ I».

contenu depoem1.txt avec des onglets affichés dans une fenêtre de terminal

Affichage des extrémités des lignes

Vous pouvez vérifier les espaces de fin en utilisant l’option -E (show-ends).

cat -E poem1.txt

cat -T poem1.txt dans une fenêtre de terminal

Les extrémités des lignes sont représentées par le caractère «$».

contenu de poem1.txt avec des fins de ligne affichées dans une fenêtre de terminal

Concaténation de fichiers

Cela n’a pas de sens d’avoir un poème enregistré dans deux fichiers, avec une moitié dans chacun. Joignons-les ensemble et créons un nouveau fichier avec tout le poème.

cat poem1.txt poem2.txt > jabberwocky.txt

cat poem1.txt poem2.txt> jabberwocky.txt dans une fenêtre de terminal ”width =” 646 ″ height = ”57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ” onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p><p> utilisons cat pour vérifier notre nouveau fichier: </p><pre> cat jabberwocky.txt </ pre > <p> <img loading =

Notre nouveau fichier contient le contenu des deux autres fichiers.

contenu de jabberwocky.tx dans une fenêtre de terminal

Ajout de texte à un fichier existant

C'est mieux, mais en fait, ce n'est pas tout le poème. Le dernier couplet manque. Le dernier couplet de Jabberwocky est le même que le premier couplet.

Si nous avons le premier couplet dans un fichier, nous pouvons l'ajouter au bas du fichier jabberwocky.txt, et nous aurons le poème complet.

Dans cette commande suivante, nous devons utiliser >>, pas seulement>. Si nous utilisons un seul>, nous remplacerons jabberwocky.txt. Nous ne voulons pas faire ça. Nous voulons ajouter du texte au bas de celui-ci.

cat first_verse.txt >> jabberwocky.txt

cat first_verse.txt >> jabberwocky.txt dans une fenêtre de terminal ”width =” 646 ″ height = ”57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ” onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p><p> Vérifions le contenu du fichier jabberwocky.txt: </p><pre> cat jabberwocky.txt < / pre> <p> <img loading =

Et enfin, toutes les parties du poème sont réunies.

contenu de jabberwocky.txt dans une fenêtre de terminal

Redirection de stdin

Vous pouvez rediriger l'entrée du clavier dans un fichier à l'aide de cat. Tout ce que vous tapez est redirigé dans le fichier jusqu'à ce que vous appuyiez sur Ctrl + D. Notez que nous utilisons un seul> parce que nous voulons créer le fichier (ou l'écraser, s'il existe).

cat > my_poem.txt

cat> my_poem.txt dans une fenêtre de terminal ”width =” 646 ″ height = ”57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ” onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p><p> Nous pouvons commencer à taper dès que nous émettons la commande. Nous appuyons sur Ctrl + D lorsque nous avons terminé. Nous pouvons alors vérifier le contenu du nouveau fichier avec: </p><pre> cat my-poem.txt </pre><p> <img loading =

Ce son comme une turbine lointaine est probablement Lewis Carroll qui tourne dans sa tombe à grande vitesse.

La commande tac

tac est similaire à cat, mais il répertorie le contenu des fichiers dans le sens inverse.

Voyons ça:

tac my_poem.txt

tac my_poem.txt dans une fenêtre de terminal

Et le fichier est répertorié dans la fenêtre du terminal dans l'ordre inverse. Dans ce cas, il n'a aucun effet sur ses mérites littéraires.

my_poem.txt répertorié dans l'ordre inverse dans une fenêtre de terminal

Utilisation de tac avec stdin

L'utilisation de tac sans nom de fichier le fera fonctionner sur l'entrée du clavier. Appuyer sur Ctrl + D arrêtera la phase d'entrée et tac listera dans l'ordre inverse tout ce que vous avez tapé.

tac

tac travaillant avec stdin dans une fenêtre de terminal

Lorsque Ctrl + D est frappé, l'entrée est inversée et répertoriée dans la fenêtre du terminal.

sortie de tac en utilisant stdin dans une fenêtre de terminal

Utilisation de tac avec des fichiers journaux

Mis à part les astuces de salon de basse qualité, le tac peut-il faire quelque chose d'utile? Oui il peut. De nombreux fichiers journaux ajoutent leurs dernières entrées au bas du fichier. En utilisant tac (et, contre-intuitivement, head), nous pouvons faire apparaître la dernière entrée dans la fenêtre du terminal.

Nous utilisons tac pour lister le fichier syslog à l'envers et le diriger vers head. En disant à head de n'imprimer que la première ligne qu'il reçoit (qui grâce à tac est la dernière ligne du fichier), nous voyons la dernière entrée dans le fichier syslog.

tac /var/log/syslog | head -1

tac / var / log / syslog | head -1 dans une fenêtre de terminal

head imprime la dernière entrée du fichier syslog, puis quitte.

Notez que head n'imprime qu'une seule ligne - comme nous l'avons demandé - mais la ligne est si longue qu'elle s'enroule deux fois. C'est pourquoi cela ressemble à trois lignes de sortie dans la fenêtre du terminal.

dernière entrée de syslog dans une fenêtre de terminal

Utilisation de tac avec des enregistrements de texte

Le dernier truc que Tac a dans sa manche est une beauté.

Habituellement, tac opère sur les fichiers texte en les parcourant ligne par ligne, de bas en haut. Une ligne est une séquence de caractères terminée par un caractère de nouvelle ligne. Mais nous pouvons dire à tac de travailler avec d'autres délimiteurs. Cela nous permet de traiter des «morceaux» de données dans le fichier texte comme des enregistrements de données.

Disons que nous avons un fichier journal d'un programme que nous devons examiner ou analyser. Jetons un coup d'œil à son format avec moins.

less logfile.dat

moins de fichier journal dans une fenêtre de terminal

Comme nous pouvons le voir, il existe un format répétitif dans le fichier. Il y a des séquences de trois lignes de hexadécimal valeurs. Chaque ensemble de trois lignes hexadécimales a une ligne d'étiquette qui commence «= SEQ», suivie d'une séquence de chiffres.

haut du fichier journal dans une fenêtre de terminal

Si nous faisons défiler vers le bas du fichier, nous pouvons voir qu'il y a beaucoup de ces enregistrements. Le dernier porte le numéro 865.

bas du fichier journal dans une fenêtre de terminal

Supposons que, pour une raison quelconque, nous devons traiter ce fichier dans l'ordre inverse, enregistrement de données par enregistrement de données. L'ordre des lignes des trois lignes hexadécimales de chaque enregistrement de données doit être conservé.

Nous noterons que 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. C'est un fichier très long, nous allons donc le réduire.

tac logfile.dat | less

tac logfile.dat | moins dans une fenêtre de terminal

Cela renverse le fichier, mais ce n'est pas le résultat que nous voulons. Nous voulons que le fichier soit inversé, mais les lignes de chaque enregistrement de données doivent être dans leur ordre d'origine.

fichier journal inversé en moins dans une fenêtre de terminal

Nous avons noté plus tôt que les trois dernières lignes du fichier commencent par les valeurs hexadécimales 93, E7 et B8, dans cet ordre. L'ordre de ces lignes a été inversé. De plus, les lignes «= SEQ» se trouvent désormais sous chaque ensemble de trois lignes hexadécimales.

tac à la rescousse.

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

tac -b -r -s ^ = SEQ. +[0-9]+ * $ logfile.dat | moins dans une fenêtre de terminal

Décomposons cela.

L'option -s (séparateur) informe tac de ce que nous voulons utiliser comme délimiteur entre nos enregistrements. Il dit à tac de ne pas utiliser son caractère de nouvelle ligne habituel, mais d'utiliser notre séparateur à la place.

L'option -r (regex) indique à tac de traiter la chaîne de séparation comme un expression régulière.

L'option -b (avant) oblige tac à lister le séparateur avant chaque enregistrement au lieu de le suivre (qui est la position habituelle de son séparateur par défaut, le caractère de nouvelle ligne).

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

Le caractère ^ représente le début de la ligne. Ceci est suivi de = SEQ. +[0-9]+ * $. Cela demande à tac de rechercher chaque occurrence de «= SEQ». au début d'une ligne, suivie de toute séquence de chiffres (indiquée par [0-9]), et suivi de tout autre jeu de caractères (indiqué par * $).

Nous utilisons le tout en moins, comme d'habitude.

fichier journal inversé avec des enregistrements de données correctement formés

Notre fichier est maintenant présenté dans l'ordre inverse avec chaque ligne d'étiquette «= SEQ» répertoriée avant ses trois lignes de données hexadécimales. Les trois lignes de valeurs hexadécimales sont dans leur ordre d'origine dans chaque enregistrement de données.

Nous pouvons vérifier cela simplement. La première valeur des trois premières lignes hexadécimales (qui étaient les trois dernières lignes avant que le fichier ne soit inversé) correspond aux valeurs que nous avons enregistrées précédemment: 93, E7 et B8, dans cet ordre.

C'est tout un truc pour une fenêtre de terminal à une seule ligne.

Tout a un but

Dans le monde Linux, même les commandes et utilitaires apparemment les plus simples peuvent avoir des propriétés surprenantes et puissantes.

La philosophie de conception des utilitaires simples qui font bien une chose, et qui interagissent facilement avec d'autres utilitaires, a donné lieu à d'étranges petites commandes, telles que tac. À première vue, cela semble être un peu bizarre. Mais lorsque vous regardez sous la surface, il y a un pouvoir inattendu que vous pouvez exploiter à votre avantage.

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