Anexando uma linha a um arquivo no comando cat?


11

Posso fazer cat file.txtpara obter o conteúdo de um arquivo, mas também quero aderir a uma linha final de minha própria escolha.

Tentei encanar, (cat file.txt ; echo "My final line") |mas apenas a linha final está passando pelo cano. Como posso me juntar ao gato e à linha final?

Edite para um esclarecimento: não desejo modificar o arquivo em si. Estou ciente de que, se esse fosse o caso, eu poderia fazer echo "My final line" >> file.txtou echo "My final line" | tee -a file.txtestou apenas tentando fazer o acréscimo no contexto desse comando específico, para que eu possa canalizar a concatenação de file.txte "My final line".


1
Talvez algo assim echo "My final line" >> file.txt?
Edwinksl

Na verdade, não quero acrescentar a linha ao objeto de arquivo, apenas no comando / canalização. Eu já sei que posso acrescentar a linha >>se quiser editar o arquivo.
DoubleBass 24/10

11
Você apagou acidentalmente file.txt? Seu snippet de pipe deve funcionar.
Bracken

@ DoubleBass: A resposta de Mathieu Mitchell é melhor, pois não modifica o arquivo (na memória ou no disco), mas utiliza um recurso de um comando interno.
Bryan Boettcher

Respostas:


30

Você pode aproveitar cata capacidade de ler do stdin combinada com a capacidade de ler vários arquivos para conseguir isso.

~$ cat file.txt
Hello from file.txt

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

Você também pode anexar uma linha, como tal:

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

Observe que você não está limitado a uma única linha. catlerá de stdin até atingir EOF. Você pode transmitir a saída de curl, por exemplo, para acrescentar ou acrescentar à saída 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>

1
(cat file.txt ; echo "My final line") | …também faria isso. Mas usar catpara o que foi projetado é melhor +1.
Ctrl-alt-delor

@ ctrl-alt-delor: as subcamadas também têm a desvantagem de um processo adicional de bifurcar, que é relativamente caro. Tente, por exemplo echo "$$" "$BASHPID" | head -q -n 1 /proc/mounts - | catvs. ( head -q -n 1 /proc/mounts; echo "$$" "$BASHPID" ) | catou mesmo { head -q -n 1 /proc/mounts; echo "$$" "$BASHPID"; } | cat.
David Foerster

11

Para anexar uma linha a um arquivo, você pode apenas usar o operador de redirecionamento de acréscimo de shell >>(o arquivo será open(2)editado com O_APPENDsinalizador):

echo 'My final line' >>file.txt

Agora, se você quiser apenas visualizar o conteúdo do arquivo com uma linha final anexada, eu usaria catcom dois argumentos:

  • Primeiro, seu arquivo obviamente, digamos file.txt
  • O segundo argumento seria a string de sua escolha e, para passar a string como um nome de arquivo (como catlida apenas com arquivos), você pode aproveitar a substituição do processo <(), que retornaria um descritor de arquivo ( /proc/self/fd/<fd_number>).

Juntando estes:

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

Se você deseja que a saída seja paginada, assumindo que lessé o seu pager favorito:

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

<()funciona para o bash, mas para quais outras conchas funciona? Ksh? Traço?
jpaugh

1
@jpaugh ksh, zsh- Sim, dash- Não.
heemayl 24/10

Isso modifica o original.
Ctrl-alt-delor # 24/1017

11
sed -e '$aMy final line' file.txt

A partir man sedda opção-e

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

$corresponde à última linha e aanexa a sequência.

Se você deseja anexar permanentemente a linha ao arquivo, use -i

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

Alterando o comando para

sed -i -e '$aMy final line' file.txt

1
Use aspas simples e não precisará da barra invertida.
Curinga

7

Já foi esclarecido nos comentários da pergunta, mas adicionando-a novamente como resposta aqui.

O comando observado na pergunta,

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

funciona como esperado - toda a saída do subshell formado pelos parênteses é canalizada para o segundo comando.

Se o arquivo não terminar com uma nova linha, a sequência de eco será anexada à última linha - isso é comum a todas as outras soluções aqui e pode ser resolvido adicionando outro eco (vazio) antes.


1
Se o arquivo não termina com uma nova linha, eu uso awk: awk 1 file.txt; echo "My final line". awk 1 fileé um bom truque para compensar a falta de EOL no final do arquivo.
Muru

Se o arquivo não termina com uma nova linha, você também pode simplesmente usar echo "\nMy final line"sem ter que depender deawk
fregante
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.