¿Agregar una línea a un archivo en el comando cat?

11

Puedo hacer cat file.txtpara obtener el contenido de un archivo, pero también quiero agregar una línea final de mi elección.

Traté de tuberías (cat file.txt ; echo "My final line") |pero solo la línea final pasa a través de la tubería. ¿Cómo puedo unirme al gato y a la línea final?

Edite para un punto de aclaración: no deseo modificar el archivo en sí. Soy consciente de que si este fuera el caso, podría hacerlo echo "My final line" >> file.txto echo "My final line" | tee -a file.txtsolo estoy tratando de hacer el anexo dentro del contexto de este comando en particular para poder canalizar la concatenación de file.txty "My final line".

Contrabajo
fuente
1
Tal vez algo como echo "My final line" >> file.txt?
edwinksl
No quiero agregar realmente la línea al objeto de archivo, solo en el comando / tubería. Ya sé que puedo agregar la línea >>si quisiera editar el archivo en sí.
DoubleBass
11
¿Has borrado accidentalmente file.txt? Su fragmento de tubería debería funcionar.
Bracken
@DoubleBass: la respuesta de Mathieu Mitchell es mejor, ya que no modifica el archivo (ya sea en la memoria o en el disco), sino que utiliza una función de un comando incorporado.
Bryan Boettcher

Respuestas:

30

Puede aprovechar catla capacidad de leer de stdin combinada con su capacidad de leer múltiples archivos para lograr esto.

~$ cat file.txt
Hello from file.txt

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

También puede anteponer una línea, como tal:

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

Tenga en cuenta que no está limitado a una sola línea. catleerá desde stdin hasta que llegue a EOF. Puede pasar la salida de curl, por ejemplo, para anteponer o agregar a la salida 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
fuente
1
(cat file.txt ; echo "My final line") | …También lo haría. Pero usar catpara lo que fue diseñado es mejor +1.
ctrl-alt-delor
@ ctrl-alt-delor: las subcapas también tienen la desventaja de un proceso adicional para bifurcar que es relativamente costoso. Prueba por ejemplo echo "$$" "$BASHPID" | head -q -n 1 /proc/mounts - | catvs. ( head -q -n 1 /proc/mounts; echo "$$" "$BASHPID" ) | cato incluso { head -q -n 1 /proc/mounts; echo "$$" "$BASHPID"; } | cat.
David Foerster
11

Para agregar una línea a un archivo, puede usar el operador de redirección de adición de shell, >>(el archivo se agregará con una open(2)marca O_APPEND):

echo 'My final line' >>file.txt

Ahora, si solo desea ver el contenido del archivo con una línea final agregada, lo usaría catcon dos argumentos:

  • Primero, su archivo obviamente, digamos file.txt
  • El segundo argumento sería la cadena de su elección, y para pasar la cadena como un nombre de archivo (ya que catsolo trata con archivos) puede aprovechar la sustitución del proceso <(), que devolvería un descriptor de archivo ( /proc/self/fd/<fd_number>).

Poniendo estos juntos:

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

Si desea que la salida sea paginada, suponiendo que lesssea ​​su localizador favorito:

less file.txt <(echo 'My final line')
heemayl
fuente
<()funciona para bash, pero ¿para qué otros proyectiles funciona? Ksh? ¿Guión?
jpaugh
1
@jpaugh ksh, zsh- Sí, dash- No.
heemayl el
Esto modifica el original.
ctrl-alt-delor
11
sed -e '$aMy final line' file.txt

De man sedla opción-e

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

$coincide con la última línea y aagrega la cadena.

Si desea agregar permanentemente la línea al archivo, use -i

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

Cambiar el comando a

sed -i -e '$aMy final line' file.txt
Katu
fuente
1
Use comillas simples y no necesita la barra invertida.
Comodín el
7

Ya se aclaró en los comentarios a la pregunta, pero se agregó nuevamente como respuesta aquí.

El comando anotado en la pregunta,

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

funciona como se espera: toda la salida del subshell formado por paréntesis se canaliza al segundo comando.

Si el archivo no termina con una nueva línea, la cadena con eco se agrega a la última línea; esto es común con todas las otras soluciones aquí, y se puede resolver agregando otro eco (vacío) antes.

Paŭlo Ebermann
fuente
1
Si el archivo no termina con un salto de línea, que haría uso awk: awk 1 file.txt; echo "My final line". awk 1 filees un buen truco para compensar la falta de EOL al final del archivo.
muru
Si el archivo no termina con una nueva línea, también puede usarlo echo "\nMy final line"sin tener que depender de élawk
fregante