Je peux faire cat file.txt
pour 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 dernière ligne passe dans le tuyau. Comment puis-je rejoindre le chat et la dernière ligne?
Éditer pour clarifier: je ne souhaite pas modifier le fichier lui-même. Je sais que si tel était le cas, je pourrais utiliser echo "My final line" >> file.txt
ou echo "My final line" | tee -a file.txt
, mais je n’essaie d’ajouter que dans le contexte de cette commande afin que je puisse diriger la concaténation de file.txt
et "My final line"
.
Vous pouvez tirer parti de la capacité de cat
à lire à 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 en tant que telle:
~$ echo "My final line" | cat - file.txt
My final line
Hello from file.txt
Notez que vous n'êtes pas limité à une seule ligne. cat
lira à partir de stdin jusqu'à ce qu'il atteigne EOF. Vous pouvez transmettre la sortie de curl
, par exemple, à 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 êtes ici</pre></strong></body></html>
sed -e '$aMy final line' file.txt
De man sed
l'option -e
-e script, --expression=script
add the script to the commands to be executed
$
correspond à la dernière ligne et a
ajoute 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
Pour ajouter une ligne à un fichier, vous pouvez simplement utiliser l'opérateur de redirection d'ajout Shell, >>
(le fichier sera open(2)
- ed avec l'indicateur O_APPEND
):
echo 'My final line' >>file.txt
Maintenant, si vous voulez juste voir le contenu du fichier avec une dernière ligne ajoutée, j'utiliserais cat
avec deux arguments:
file.txt
cat
ne traite que des fichiers), vous pouvez utiliser la substitution de processus, <()
, qui renverrait un descripteur de fichier (/proc/self/fd/<fd_number>)
.Mettre ensemble ces:
cat file.txt <(echo 'My final line')
Si vous souhaitez que la sortie soit paginée, supposez que less
est votre pageur préféré:
less file.txt <(echo 'My final line')
Cela a déjà été clarifié dans les commentaires de la question, mais en l'ajoutant à 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 transmise à 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 - ceci est commun à toutes les autres solutions ici, et peut être résolu en ajoutant un autre écho (vide) avant.