Ajout d'une ligne à un fichier dans la commande cat?

11

Je peux faire cat file.txtpour obtenir le contenu d'un fichier, mais je veux aussi clouer sur une dernière ligne de mon choix.

J'ai essayé la tuyauterie (cat file.txt ; echo "My final line") |mais seule la ligne finale passe à travers le tuyau. Comment puis-je rejoindre le chat et la ligne finale?

Modifier pour un point de clarification: je ne souhaite pas modifier le fichier lui-même. Je suis conscient que si c'était le cas, je pourrais le faire echo "My final line" >> file.txtou echo "My final line" | tee -a file.txtmais j'essaie seulement de faire l'ajout dans le contexte de cette commande particulière afin que je puisse diriger la concaténation de file.txtet "My final line".

Contrebasse
la source
1
Peut-être quelque chose comme ça echo "My final line" >> file.txt?
edwinksl
Je ne veux pas réellement ajouter la ligne à l'objet fichier, juste dans la commande / piping. Je sais déjà que je peux ajouter la ligne avec >>si je voulais éditer le fichier lui-même.
DoubleBass
11
Avez-vous effacé accidentellement file.txt? Votre extrait de pipe devrait fonctionner.
Bracken
@DoubleBass: la réponse de Mathieu Mitchell est meilleure, car elle ne modifie pas le fichier (en mémoire ou sur disque), mais utilise à la place une fonctionnalité d'une commande intégrée.
Bryan Boettcher

Réponses:

30

Vous pouvez exploiter catla capacité de lecture à partir de stdin combinée à sa capacité à lire plusieurs fichiers pour y parvenir.

~$ cat file.txt
Hello from file.txt

~$ echo "My final line" | cat file.txt -
Hello from file.txt
My final line

Vous pouvez également ajouter une ligne au préalable:

~$ echo "My final line" | cat - file.txt
My final line
Hello from file.txt

Notez que vous n'êtes pas limité à une seule ligne. catva lire depuis stdin jusqu'à ce qu'il atteigne EOF. Vous pouvez passer la sortie de curl, par exemple, pour ajouter ou ajouter à la sortie de cat.

~$ curl -s http://perdu.com | cat file.txt -
Hello from file.txt
<html><head><title>Vous Etes Perdu ?</title></head><body><h1>Perdu sur l'Internet ?</h1><h2>Pas de panique, on va vous aider</h2><strong><pre>    * <----- vous &ecirc;tes ici</pre></strong></body></html>
Mathieu Mitchell
la source
1
(cat file.txt ; echo "My final line") | …le ferait aussi. Mais utiliser catce pour quoi il a été conçu vaut mieux +1.
ctrl-alt-delor du
@ ctrl-alt-delor: Les sous-shells ont aussi l'inconvénient d'un processus supplémentaire à fork qui est relativement cher. Essayez par exemple echo "$$" "$BASHPID" | head -q -n 1 /proc/mounts - | catvs ( head -q -n 1 /proc/mounts; echo "$$" "$BASHPID" ) | catou même { head -q -n 1 /proc/mounts; echo "$$" "$BASHPID"; } | cat.
David Foerster
11

Pour ajouter une ligne à un fichier, vous pouvez simplement utiliser l'opérateur de redirection d'ajout de shell, >>(le fichier sera open(2)-ed avec O_APPENDindicateur):

echo 'My final line' >>file.txt

Maintenant, si vous voulez simplement afficher le contenu du fichier avec une dernière ligne ajoutée, j'utiliserais catavec deux arguments:

  • Tout d'abord, votre dossier évidemment, disons file.txt
  • Le deuxième argument serait la chaîne de votre choix, et pour passer la chaîne en tant que nom de fichier (car catne concerne que les fichiers), vous pouvez tirer parti de la substitution de processus <(), qui retournerait un descripteur de fichier ( /proc/self/fd/<fd_number>).

Assembler ces éléments:

cat file.txt <(echo 'My final line')

Si vous souhaitez que la sortie soit paginée, en supposant qu'il lesss'agit de votre pageur préféré:

less file.txt <(echo 'My final line')
heemayl
la source
<()fonctionne pour bash, mais pour quels autres obus ça marche? Ksh? Tiret?
jpaugh
1
@jpaugh ksh, zsh- Oui, dash- Non.
heemayl
Cela modifie l'original.
ctrl-alt-delor
11
sed -e '$aMy final line' file.txt

De man sedl'option-e

-e script, --expression=script
    add the script to the commands to be executed

$correspond à la dernière ligne et aajoute la chaîne.

Si vous souhaitez ajouter définitivement la ligne au fichier, utilisez -i

-i[SUFFIX], --in-place[=SUFFIX]
    edit files in place (makes backup if SUFFIX supplied)

Changer la commande en

sed -i -e '$aMy final line' file.txt
Katu
la source
1
Utilisez des guillemets simples et vous n'avez pas besoin de la barre oblique inverse.
Wildcard
7

Elle a déjà été clarifiée dans les commentaires de la question, mais l'ajoute à nouveau comme réponse ici.

La commande a noté dans la question,

(cat file.txt ; echo "My final line") | other command

fonctionne comme prévu - toute la sortie du sous-shell formé par les parenthèses est dirigée vers la deuxième commande.

Si le fichier ne se termine pas par une nouvelle ligne, la chaîne en écho est ajoutée à la dernière ligne - cela est courant avec toutes les autres solutions ici, et peut être résolu en ajoutant un autre écho (vide) avant.

Paŭlo Ebermann
la source
1
Si le fichier ne se termine pas avec un saut de ligne, j'utiliser awk: awk 1 file.txt; echo "My final line". awk 1 fileest une bonne astuce pour compenser les EOL manquants à la fin du fichier.
muru
Si le fichier ne se termine pas avec une nouvelle ligne, vous pouvez également l'utiliser echo "\nMy final line"sans avoir à dépendre deawk
fregante