GNU/Linux >> Tutoriels Linux >  >> Linux

Commande Cat sous Linux :Exemples essentiels et avancés

Poursuivant le tour de ces commandes peu connues entamées la semaine dernière avec la commande ls, examinons aujourd'hui le cat commande.

Le cat le nom signifie catenate car le travail principal de cette commande est de joindre plusieurs fichiers d'entrée en envoyant séquentiellement leur contenu sur la sortie standard :

# Let's obtain first some sample data files:
curl -so - dict://dict.org/'d:felidae:gcide' | unexpand -a -t 3 |
  sed -Ee '/^151/,/^[.]/!d;/^[.0-9]/s/.*//' > felidae.txt
curl -so - dict://dict.org/'d:felis:gcide' | unexpand -a -t 3 |
  sed -Ee '/^151/,/^[.]/!d;/^[.0-9]/s/.*//' > felis.txt

# Catenate files
cat felidae.txt felis.txt

Si vous souhaitez stocker le résultat de cette concaténation dans un fichier, vous devez utiliser une redirection shell :

cat felidae.txt felis.txt > result.txt
cat result.txt

Même si son objectif de conception principal est de caténer les fichiers, le cat L'utilitaire est également souvent utilisé avec un seul argument pour afficher le contenu de ce fichier à l'écran, exactement comme je l'ai fait à la dernière ligne de l'exemple ci-dessus.

A. Utiliser la commande cat avec une entrée standard

Lorsqu'il est utilisé sans aucun argument, le cat La commande lira les données de son entrée standard et les écrira sur sa sortie standard, ce qui est généralement inutile… à moins que vous n'utilisiez une option pour transformer les données. Nous parlerons de quelques options intéressantes plus tard.

En plus des chemins de fichiers, le cat la commande comprend également le - nom de fichier spécial comme alias pour l'entrée standard. De cette façon, vous pouvez insérer les données lues à partir de l'entrée standard entre les fichiers indiqués sur la ligne de commande :

# Insert a separator between the two concatenated files
echo '----' | cat felis.txt - felidae.txt

B. Utilisation de la commande cat avec des fichiers binaires

1. Joindre des fichiers fractionnés

Le cat La commande ne fait aucune hypothèse sur le contenu du fichier, elle fonctionnera donc avec plaisir avec des données binaires. Quelque chose qui peut être utile pour rejoindre les fichiers cassés par le split ou csplit commande. Ou pour rejoindre des téléchargements partiels comme nous allons le faire maintenant :

#
# A picture by Von.grzanka (CC-SA 3.0)
# Optimize bandwidth usage by breaking the download in two parts
# (on my system, I observe a 10% gain that way compared to a "full" download)
curl -s -r 0-50000 \
    https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Felis_catus-cat_on_snow.jpg/1024px-Felis_catus-cat_on_snow.jpg \
    -o first-half &
curl -s -r 50001- \
    https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Felis_catus-cat_on_snow.jpg/1024px-Felis_catus-cat_on_snow.jpg \
    -o second-half &
wait

Nous avons maintenant deux moitiés d'une image. Vous pouvez ouvrir la première moitié et voir qu'elle est "cassé" en utilisant l'display d'ImageMagick , ou gimp , ou tout autre logiciel capable de lire les fichiers image :

display first-half
# -or-
gimp first-half
# -or-
firefox first-half

Si vous étudiez la curl commande que j'ai utilisée, vous voyez que les deux parties sont parfaitement complémentaires. La première moitié va de l'octet 0 à 50000 et la seconde moitié, de l'octet 50001 à la fin du fichier. Il ne doit y avoir aucune donnée manquante entre eux. Il suffit donc de caténer les deux parties ensemble (dans le bon ordre) pour récupérer le fichier complet :

cat first-half second-half > image.jpg
display image.jpg

2. Travailler avec des formats de fichiers diffusables

Non seulement vous pouvez utiliser le cat commande pour "rejoindre" les fichiers binaires qui ont été divisés en plusieurs parties, mais dans certains cas, vous pouvez également créer nouveau fichiers de cette façon. Cela fonctionne particulièrement bien avec les formats de fichiers "sans en-tête" ou "diffusables" comme les fichiers vidéo de flux de transport MPEG (.TS fichiers):

# Let's make a still video file from our picture
ffmpeg -y -loop 1 -i cat.jpg -t 3  \
    -c:v libx264 -vf scale=w=800:h=-1 \
    still.ts

# Let's make a fade-in from the same picture
ffmpeg -y -loop 1 -i cat.jpg -t 3  \
    -c:v libx264 -vf scale=w=800:h=-1,fade=in:0:75 \
    fadein.ts

# Let's make a fade-out from the same picture
ffmpeg -y -loop 1 -i cat.jpg -t 3  \
    -c:v libx264 -vf scale=w=800:h=-1,fade=out:0:75 \
    fadeout.ts

Nous pouvons maintenant combiner tous ces fichiers vidéo de flux de transport en utilisant le cat commande, obtenant un fichier TS parfaitement valide dans la sortie :

cat fadein.ts still.ts fadeout.ts > video.ts
mplayer video.ts

Grâce au format de fichier TS, vous pouvez combiner ces fichiers dans l'ordre que vous souhaitez, et vous pouvez même utiliser le même fichier plusieurs fois dans la liste des arguments pour créer des boucles ou des répétitions dans la vidéo de sortie. Évidemment, ce serait plus amusant si nous utilisions des images animées, mais je vous laisse le faire vous-même :de nombreux appareils grand public enregistrent des fichiers TS, et s'ils ne le font pas, vous pouvez toujours utiliser ffmpeg pour convertir presque n'importe quel fichier vidéo en un fichier de flux de transport. N'hésitez pas à partager vos créations en utilisant la section des commentaires !

3. Pirater les archives cpio

Comme dernier exemple, voyons comment nous pouvons utiliser le cat commande pour combiner plusieurs cpio les archives. Mais cette fois, ce ne sera pas aussi simple car cela nécessitera un peu de connaissances sur le cpio format de fichier d'archive.

Un cpio archive stocke les métadonnées et le contenu du fichier de manière séquentielle, ce qui le rend approprié pour la concaténation au niveau du fichier avec le cat utilitaire. Malheureusement, le cpio archive contient également une bande-annonce utilisée pour marquer la fin de l'archive :

# Create two genuine CPIO `bin` archive:
$ find felis.txt felidae.txt | cpio -o > part1.cpio
2 blocks
$ echo cat.jpg | cpio -o > part2.cpio
238 blocks

$ hexdump -C part1.cpio | tail -7
000002d0  2e 0d 0a 09 09 20 20 5b  57 6f 72 64 4e 65 74 20  |.....  [WordNet |
000002e0  31 2e 35 5d 0d 0a 0a 00  c7 71 00 00 00 00 00 00  |1.5].....q......|
000002f0  00 00 00 00 01 00 00 00  00 00 00 00 0b 00 00 00  |................|
00000300  00 00 54 52 41 49 4c 45  52 21 21 21 00 00 00 00  |..TRAILER!!!....|
00000310  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000400
$ hexdump -C part2.cpio | tail -7
0001da40  46 96 ab f8 ad 11 23 90  32 79 ac 1f 8f ff d9 00  |F.....#.2y......|
0001da50  c7 71 00 00 00 00 00 00  00 00 00 00 01 00 00 00  |.q..............|
0001da60  00 00 00 00 0b 00 00 00  00 00 54 52 41 49 4c 45  |..........TRAILE|
0001da70  52 21 21 21 00 00 00 00  00 00 00 00 00 00 00 00  |R!!!............|
0001da80  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
0001dc00

La bonne nouvelle est, avec les archives binaires cpio, que la bande-annonce a une longueur fixe de 280 octets. Donc, en utilisant le head commande standard, nous avons un moyen simple de le supprimer :

# Each archive end with the 280-byte trailer.
# To catenate both archives, just remove the trailer
# at the end of the first part:
$ head -c-280 part1.cpio | cat - part2.cpio > cat.cpio
$ cpio -it < cat.cpio
felis.txt
felidae.txt
cat.jpg
239 blocks

C. Options de commande cat essentielles

Après avoir joué avec divers formats de fichiers binaires, revenons maintenant aux anciens fichiers texte en étudiant quelques options spécialement conçues pour traiter ces fichiers. Bien qu'elles ne fassent pas partie de la norme POSIX, ces options sont portables sur BSD et GNU cat implémentations. Veuillez noter que je ne prétends pas être exhaustif ici, alors vérifiez le man pour voir la liste complète des options prises en charge par cat sur votre système !

-n :droites numériques

Avec le n option, le cat préfixera chaque ligne de sortie par son numéro de ligne :

cat -n felidae.txt
     1
     2    Felidae \Felidae\ n.
     3       a natural family of lithe-bodied round-headed fissiped
     4       mammals, including the cats; wildcats; lions; leopards;
     5       cheetahs; and saber-toothed tigers.
     6
     7       Syn: family {Felidae}.
     8            [WordNet 1.5]
     9

Le -n numéros d'option sortie lignes. Cela signifie que le compteur n'est pas réinitialiser lors du passage d'un fichier d'entrée à l'autre, comme vous le verrez si vous essayez vous-même la commande suivante :

cat -n feli*.txt

-s  :supprimer les lignes de sortie vides répétées

Avec le -s option, le cat La commande réduira plusieurs lignes vides consécutives en une seule :

 cat -n felis.txt felidae.txt | sed -n 8,13p
     8       lynx ({Felis lynx}) is also called {Lynx lynx}.
     9       [1913 Webster +PJC]
    10
    11
    12    Felidae \Felidae\ n.
    13       a natural family of lithe-bodied round-headed fissiped
[email protected]:~$ cat -ns felis.txt felidae.txt | sed -n 8,13p
     8       lynx ({Felis lynx}) is also called {Lynx lynx}.
     9       [1913 Webster +PJC]
    10
    11    Felidae \Felidae\ n.
    12       a natural family of lithe-bodied round-headed fissiped
    13       mammals, including the cats; wildcats; lions; leopards;

Dans l'exemple ci-dessus, vous pouvez voir, dans la sortie par défaut, les lignes 10 et 11 étaient vides. Lors de l'ajout du -s option, la deuxième ligne vide a été ignorée.

-b :numéroter uniquement les lignes non vides

Un peu lié aux deux options précédentes, le -b l'option numérotera les lignes, mais en ignorant les vides :

$ cat -b felidae.txt | cat -n
     1
     2         1    Felidae \Felidae\ n.
     3         2        a natural family of lithe-bodied round-headed fissiped
     4         3        mammals, including the cats; wildcats; lions; leopards;
     5         4        cheetahs; and saber-toothed tigers.
     6         5
     7         6        Syn: family {Felidae}.
     8         7              [WordNet 1.5]
     9

L'exemple ci-dessus utilise deux instances du cat commande avec différentes options dans un pipeline. La numérotation intérieure vient du -b option utilisée avec le premier cat commande. La numérotation extérieure vient du -n option utilisée avec le deuxième cat .

Comme vous pouvez le voir, la première et la dernière ligne n'étaient pas numéroté par le -b option parce qu'ils sont vides. Mais qu'en est-il de la 6ème ligne ? Pourquoi est-il toujours numéroté avec le -b option? Eh bien, parce que c'est un vide ligne - mais pas vide un, comme nous le verrons dans la section suivante.

-v , -e , -t :affiche les caractères non imprimables

Les trois options -v , -e `, and `-t sont utilisés pour afficher différents ensembles de caractères invisibles. Même si les ensembles se chevauchent, il n'y a pas d'option "fourre-tout", vous devrez donc les combiner si vous souhaitez afficher tous caractères invisibles.

-v :afficher les caractères invisibles

Le -v option affiche tous les caractères non imprimables avec caret et méta notation, sauf le saut de ligne et la tabulation.

Avec cette option, les caractères de contrôle apparaîtront sous la forme d'un caret (^ ) suivi du caractère ASCII approprié (par exemple, le retour chariot, octet 13, est affiché sous la forme ^M parce que M en ASCII est 64 + 13), et les caractères dont le bit de poids fort est défini apparaîtront en notation "méta" M- suivi de la représentation correspondant aux 7 bits inférieurs (par exemple, l'octet 141 sera affiché sous la forme M-^M car 141 est 128 + 13).

Bien qu'apparemment ésotérique, cette fonctionnalité peut être utile lorsque vous travaillez avec des fichiers binaires, comme, par exemple, si vous souhaitez examiner les informations brutes intégrées dans un fichier JPEG :

$ cat -v cat.jpg | fold -75 | head -10
M-^?M-XM-^?M-`^@^PJFIF^@^A^A^A^@H^@H^@^@M-^?M-~^@QFile source: http://commo
ns.wikimedia.org/wiki/File:Felis_catus-cat_on_snow.jpgM-^?M-b^LXICC_PROFILE
^@^A^A^@^@^LHLino^B^P^@^@mntrRGB XYZ ^GM-N^@^B^@    ^@^F^@1^@^@acspMSFT
^@^@^@^@IEC sRGB^@^@^@^@^@^@^@^@^@^@^@^@^@^@M-vM-V^@^A^@^@^@^@M-S-HP  ^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@^@^@^@^Qcprt^@^@^AP^@^@^@3desc^@^@^AM-^D^@^@^@lwtpt^@^@^AM-p^@^@^@^
Tbkpt^@^@^B^D^@^@^@^TrXYZ^@^@^B^X^@^@^@^TgXYZ^@^@^B,^@^@^@^TbXYZ^@^@^[email protected]^@^@
^@^Tdmnd^@^@^BT^@^@^@pdmdd^@^@^BM-D^@^@^@M-^Hvued^@^@^CL^@^@^@M-^Fview^@^@^
CM-T^@^@^@$lumi^@^@^CM-x^@^@^@^Tmeas^@^@^D^L^@^@^@$tech^@^@^D0^@^@^@^LrTRC^
@^@^D<^@^@^H^LgTRC^@^@^D<^@^@^H^LbTRC^@^@^D<^@^@^H^Ltext^@^@^@^@Copyright (

Un autre cas d'utilisation pour le -v L'option recherche les caractères de contrôle qui auraient pu fuir dans un fichier texte. Si vous vous en souvenez, nous avons ce problème étrange ci-dessus avec le -b option numérotant la 6ème ligne d'entrée, alors qu'elle avait l'air comme si c'était vide. Alors examinons cela :

$ cat -v felidae.txt
Felidae \Felidae\ n.^M
    a natural family of lithe-bodied round-headed fissiped^M
    mammals, including the cats; wildcats; lions; leopards;^M
    cheetahs; and saber-toothed tigers.^M
^M
    Syn: family {Felidae}.^M
          [WordNet 1.5]^M

Ah ah! Voyez-vous ces ^M Des marques? Ils sont utilisés pour remplacer le caractère de retour chariot autrement invisible. D'où vient-il? Eh bien, le dict protocole, comme tout autre protocole Internet, utilise CRLF comme terminaison de ligne. Nous les avons donc téléchargés dans le cadre de nos exemples de fichiers. Vous pouvez en savoir plus sur les sauts de ligne et les retours chariot dans le fold et fmt article. Mais pour l'instant, cela explique pourquoi cat considère la 6ème ligne comme non vide.

-e :affiche les caractères invisibles, y compris les fins de ligne

Le -e l'option fonctionne comme -v option, sauf qu'il ajoutera également un signe dollar ($ ) avant chaque caractère de saut de ligne, montrant ainsi explicitement la fin des lignes :

$ cat -e felidae.txt
$
Felidae \Felidae\ n.^M$
    a natural family of lithe-bodied round-headed fissiped^M$
    mammals, including the cats; wildcats; lions; leopards;^M$
    cheetahs; and saber-toothed tigers.^M$
^M$
    Syn: family {Felidae}.^M$
          [WordNet 1.5]^M$
$

-t :affiche les caractères invisibles, y compris les tabulations

Le -t l'option fonctionne comme -v option, sauf qu'il affichera également les tabulations en utilisant le ^I notation caret (la tabulation est stockée sous la forme d'un octet contenant la valeur 9 et I en ASCII est 64+9=73):

$ cat -t felidae.txt

Felidae \Felidae\ n.^M
^Ia natural family of lithe-bodied round-headed fissiped^M
^Imammals, including the cats; wildcats; lions; leopards;^M
^Icheetahs; and saber-toothed tigers.^M
^M
^ISyn: family {Felidae}.^M
^I^I  [WordNet 1.5]^M

-et :affiche tous les caractères masqués

Comme je l'ai déjà mentionné brièvement, si vous souhaitez afficher tous les caractères non imprimables, y compris les tabulations et les marqueurs de fin de ligne, vous devrez utiliser à la fois le -e et -t option :

$ cat -et felidae.txt
$
Felidae \Felidae\ n.^M$
^Ia natural family of lithe-bodied round-headed fissiped^M$
^Imammals, including the cats; wildcats; lions; leopards;^M$
^Icheetahs; and saber-toothed tigers.^M$
^M$
^ISyn: family {Felidae}.^M$
^I^I  [WordNet 1.5]^M$
$

Bonus :L'utilisation inutile de la commande cat sous Linux

Pas d'article sur le cat La commande serait complète sans une mention de l'anti-modèle "Utilisation inutile du chat".

Cela se produit lorsque vous utilisez cat dans le seul but d'envoyer le contenu d'un fichier sur l'entrée standard d'une autre commande. Cette utilisation du cat La commande est dite "inutile" car une simple redirection ou un paramètre de nom de fichier aurait fait l'affaire, et l'aurait fait mieux. Mais un exemple vaut mille mots :

$ curl -so - dict://dict.org/'d:uuoc:jargon' |    sed -Ee '/^151/,/^[.]/!d;/^[.0-9]/s/.*//'  > uuoc.txt
$ cat uuoc.txt | less

UUOC


    [from the comp.unix.shell group on Usenet] Stands for Useless Use of {cat};
    the reference is to the Unix command cat(1), not the feline animal. As
    received wisdom on comp.unix.shell observes, ?The purpose of cat is to
    concatenate (or ?catenate?) files. If it's only one file, concatenating it
    with nothing at all is a waste of time, and costs you a process.?
    Nevertheless one sees people doing


    cat file | some_command and its args ...

    instead of the equivalent and cheaper


    <file some_command and its args ...

    or (equivalently and more classically)


    some_command and its args ... <file
[...]

Dans l'exemple ci-dessus, j'ai utilisé un pipeline pour afficher le contenu du uuoc.txt fichier avec le less téléavertisseur :

cat uuoc.txt | less

Ainsi, le seul but du cat commande était d'alimenter l'entrée standard du less commande avec le contenu du uuoc.txt dossier. J'aurais obtenu le même comportement en utilisant une redirection shell :

less < uuoc.txt

En fait, le less La commande, comme de nombreuses commandes, accepte également un nom de fichier comme argument. J'aurais donc pu simplement écrire cela à la place :

less uuoc.txt

Comme vous pouvez le voir, pas besoin de cat ici. Si je mentionne l'anti-pattern "Usage inutile du chat", c'est parce que, si vous l'utilisez publiquement sur un forum ou ailleurs, quelqu'un vous le signalera sans doute avec l'argument que vous créerez un "processus supplémentaire pour rien". ”

Je dois admettre que pendant longtemps j'ai été assez dédaigneux avec de tels commentaires. Après tout, sur notre matériel moderne, générer un processus supplémentaire pour une opération unique ne pouvait pas entraîner autant de surcharge.

Mais en écrivant cet article, j'ai fait une expérience rapide, comparant le temps nécessaire avec et sans UUOC par un test awk script pour traiter 500 Mo de données provenant d'un média lent.

A ma grande surprise, la différence était loin d'être négligeable :

Cependant, la raison n'est pas la création d'un processus supplémentaire. Mais en raison de la lecture/écriture supplémentaire et du changement de contexte, l'UUOC encourt (comme vous pouvez le déduire du temps passé à exécuter le code système). Donc, en effet, lorsque vous travaillez sur de grands ensembles de données, ce cat supplémentaire commande a un coût non négligeable. Quant à moi, je vais essayer d'être plus vigilant avec ça maintenant ! Et tu? Si vous avez des exemples d'Utilisation Inutile du Chat n'hésitez pas à nous les partager !


Linux
  1. Commande Linux Cat :utilisation et exemples

  2. Commandes Linux - Présentation et exemples

  3. Exemples importants de commandes Cat sous Linux

  4. Comment copier des fichiers sous Linux et Unix ? 10 exemples de commandes cp

  5. 10 exemples de commandes Cat pour gérer des fichiers sous Linux / UNIX

Rechercher la commande sous Linux (Rechercher des fichiers et des répertoires)

Commande lsof sous Linux (10 exemples)

Options de commande et exemples de commande Tee sous Linux

Exemples essentiels de la commande ps sous Linux

Exemples de commande Linux cat

Commande lsof sous Linux avec exemples