Posso fazer cat file.txt
para 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.txt
ou echo "My final line" | tee -a file.txt
estou apenas tentando fazer o acréscimo no contexto desse comando específico, para que eu possa canalizar a concatenação de file.txt
e "My final line"
.
command-line
pipe
cat
echo
Contrabaixo
fonte
fonte
echo "My final line" >> file.txt
?>>
se quiser editar o arquivo.file.txt
? Seu snippet de pipe deve funcionar.Respostas:
Você pode aproveitar
cat
a capacidade de ler do stdin combinada com a capacidade de ler vários arquivos para conseguir isso.Você também pode anexar uma linha, como tal:
Observe que você não está limitado a uma única linha.
cat
lerá de stdin até atingir EOF. Você pode transmitir a saída decurl
, por exemplo, para acrescentar ou acrescentar à saída decat
.fonte
(cat file.txt ; echo "My final line") | …
também faria isso. Mas usarcat
para o que foi projetado é melhor +1.echo "$$" "$BASHPID" | head -q -n 1 /proc/mounts - | cat
vs.( head -q -n 1 /proc/mounts; echo "$$" "$BASHPID" ) | cat
ou mesmo{ head -q -n 1 /proc/mounts; echo "$$" "$BASHPID"; } | cat
.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 comO_APPEND
sinalizador):Agora, se você quiser apenas visualizar o conteúdo do arquivo com uma linha final anexada, eu usaria
cat
com dois argumentos:file.txt
cat
lida apenas com arquivos), você pode aproveitar a substituição do processo<()
, que retornaria um descritor de arquivo (/proc/self/fd/<fd_number>)
.Juntando estes:
Se você deseja que a saída seja paginada, assumindo que
less
é o seu pager favorito:fonte
<()
funciona para o bash, mas para quais outras conchas funciona? Ksh? Traço?ksh
,zsh
- Sim,dash
- Não.A partir
man sed
da opção-e
$
corresponde à última linha ea
anexa a sequência.Se você deseja anexar permanentemente a linha ao arquivo, use
-i
Alterando o comando para
fonte
Já foi esclarecido nos comentários da pergunta, mas adicionando-a novamente como resposta aqui.
O comando observado na pergunta,
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.
fonte
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.echo "\nMy final line"
sem ter que depender deawk