Appending a line to a file in the cat command?
Sophia Terry
I can do cat file.txt to get the contents of a file but I also want to tack on a final line of my own choosing.
I tried piping (cat file.txt ; echo "My final line") | but only the final line is getting passed through the pipe. How can I join the cat and final line?
Edit for a point of clarification: I do not wish to modify the file itself. I am aware that if this were the case I could do echo "My final line" >> file.txt or echo "My final line" | tee -a file.txt but I am only trying to do the append within the context of this particular command so I can pipe in the concatenation of file.txt and "My final line".
4 Answers
You can leverage cat's ability to read from stdin combined with it's ability to read multiple files to achieve this.
~$ cat file.txt
Hello from file.txt
~$ echo "My final line" | cat file.txt -
Hello from file.txt
My final lineYou can also prepend a line, as such:
~$ echo "My final line" | cat - file.txt
My final line
Hello from file.txtNote that you are not limited to a single line. cat will read from stdin until it reaches EOF. You can pass the output from curl, for example, to prepend or append to the output of cat.
~$ curl -s | 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> 2 For appending a line to a file, you can just use shell append redirection operator, >> (the file will be open(2)-ed with O_APPEND flag):
echo 'My final line' >>file.txtNow, if you want just to view the content of the file with a final line appended, i would use cat with two arguments:
- First, your file obviously, let's say
file.txt - Second argument would be the string of your choice, and to pass the string as a filename (as
catonly deals with files) you can leverage process substitution,<(), which would return a file descriptor (/proc/self/fd/<fd_number>).
Putting these together:
cat file.txt <(echo 'My final line')If you want the output to be paged, assuming less is your favorite pager:
less file.txt <(echo 'My final line') 3 sed -e '$aMy final line' file.txtFrom man sed the option -e
-e script, --expression=script add the script to the commands to be executed$ matches the last line and a appends the string.
If you wanted to permanently append the line to the file, use -i
-i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if SUFFIX supplied)Changing the command to
sed -i -e '$aMy final line' file.txt 1 It was already clarified in the comments to the question, but adding it again as an answer here.
The command noted in the question,
(cat file.txt ; echo "My final line") | other commandworks as is expected – all the output from the subshell formed by the parentheses is piped to the second command.
If the file doesn't end with a new line, the echoed string is appended to the last line – this is common with all the other solutions here, and can be solved by adding another (empty) echo before.
2