Questão Como faço para salvar a saída do terminal em um arquivo?


Como faço para salvar a saída de um comando em um arquivo?

Existe uma maneira sem usar qualquer software? Eu gostaria de saber como.


397
2018-02-14 19:49


origem




Respostas:


Sim, é possível, apenas redirecione a saída para um arquivo:

someCommand > someFile.txt  

Ou se você quiser acrescentar dados:

someCommand >> someFile.txt

Se você quiser stderr também use isso:

someCommand &> someFile.txt  

ou isso para acrescentar:

someCommand &>> someFile.txt  

390
2018-02-14 19:52



Observe que someCommand 2> someFile.txt e someCommand 2>> someFile.txt também redireciona stterr para someFile.txt - Slothworks
Estou tentando fazer isso com o comando gcc mas não funciona. Funciona com outros comandos, mas não este. Ele simplesmente cria o arquivo de saída sem nada dentro dele. - Nik-Lz
@ Nik-Lz Muitas vezes isso ocorre porque o comando está enviando toda a sua saída em stderr. Se o gcc estiver gerando mensagens de erro, isso parece provável. Veja o comentário do Slothworks sobre como capturar stderr em vez de stdout. - Jonathan Hartley
NB: para obter a saída do make comando em um arquivo requer esta sintaxe: make > someFile.txt 2>&1 (fonte: linuxquestions.org/questions/linux-newbie-8/…) - Gabriel Staples
@ KyleBridenstine Veja o tee resposta abaixo (askubuntu.com/a/485762/44179) - Seth♦


Para gravar a saída de um comando em um arquivo, existem basicamente 10 maneiras comumente usadas.

Visão geral:

Por favor, note que o n.e. na coluna de sintaxe significa "não existente".
  Existe um caminho, mas é complicado demais para caber na coluna. Você pode encontrar um link útil na seção Lista sobre isso.

          || visible in terminal ||   visible in file   || existing
  Syntax  ||  StdOut  |  StdErr  ||  StdOut  |  StdErr  ||   file   
==========++==========+==========++==========+==========++===========
    >     ||    no    |   yes    ||   yes    |    no    || overwrite
    >>    ||    no    |   yes    ||   yes    |    no    ||  append
          ||          |          ||          |          ||
   2>     ||   yes    |    no    ||    no    |   yes    || overwrite
   2>>    ||   yes    |    no    ||    no    |   yes    ||  append
          ||          |          ||          |          ||
   &>     ||    no    |    no    ||   yes    |   yes    || overwrite
   &>>    ||    no    |    no    ||   yes    |   yes    ||  append
          ||          |          ||          |          ||
 | tee    ||   yes    |   yes    ||   yes    |    no    || overwrite
 | tee -a ||   yes    |   yes    ||   yes    |    no    ||  append
          ||          |          ||          |          ||
 n.e. (*) ||   yes    |   yes    ||    no    |   yes    || overwrite
 n.e. (*) ||   yes    |   yes    ||    no    |   yes    ||  append
          ||          |          ||          |          ||
|& tee    ||   yes    |   yes    ||   yes    |   yes    || overwrite
|& tee -a ||   yes    |   yes    ||   yes    |   yes    ||  append

Lista:

  • command > output.txt

    O fluxo de saída padrão será redirecionado apenas para o arquivo, não será visível no terminal. Se o arquivo já existir, ele será sobrescrito.

  • command >> output.txt

    O fluxo de saída padrão será redirecionado apenas para o arquivo, não será visível no terminal. Se o arquivo já existir, os novos dados serão anexados ao final do arquivo.

  • command 2> output.txt

    O fluxo de erro padrão será redirecionado apenas para o arquivo, não será visível no terminal. Se o arquivo já existir, ele será sobrescrito.

  • command 2>> output.txt

    O fluxo de erro padrão será redirecionado apenas para o arquivo, não será visível no terminal. Se o arquivo já existir, os novos dados serão anexados ao final do arquivo.

  • command &> output.txt

    Tanto a saída padrão quanto o fluxo de erro padrão serão redirecionados apenas para o arquivo, nada será visível no terminal. Se o arquivo já existir, ele será sobrescrito.

  • command &>> output.txt

    Tanto a saída padrão quanto o fluxo de erro padrão serão redirecionados apenas para o arquivo, nada será visível no terminal. Se o arquivo já existir, os novos dados serão anexados ao final do arquivo.

  • command | tee output.txt

    O fluxo de saída padrão será copiado para o arquivo, ele ainda estará visível no terminal. Se o arquivo já existir, ele será sobrescrito.

  • command | tee -a output.txt

    O fluxo de saída padrão será copiado para o arquivo, ele ainda estará visível no terminal. Se o arquivo já existir, os novos dados serão anexados ao final do arquivo.

  • (*)

    O Bash não tem sintaxe abreviada que permita colocar apenas o StdErr em um segundo comando, o que seria necessário aqui em combinação com tee novamente para completar a tabela. Se você realmente precisa de algo assim, por favor, olhe "Como canalizar stderr e não stdout?" no estouro de pilha por algumas maneiras, como isto pode ser feito, e. trocando fluxos ou usando substituição de processos.

  • command |& tee output.txt

    Tanto a saída padrão quanto os fluxos de erro padrão serão copiados para o arquivo enquanto ainda estiverem visíveis no terminal. Se o arquivo já existir, ele será sobrescrito.

  • command |& tee -a output.txt

    Tanto a saída padrão quanto os fluxos de erro padrão serão copiados para o arquivo enquanto ainda estiverem visíveis no terminal. Se o arquivo já existir, os novos dados serão anexados ao final do arquivo.


539
2018-02-08 14:52



Obrigado pela mesa, é excelente! Esta deve ser a resposta principal - DevShark
@ karthick87 Isso não está realmente relacionado à questão de redirecionar a saída para um arquivo, porque ele apenas redireciona um fluxo para outro. 2>&1 redireciona STDERR para STDOUT, 1>&2 redireciona STDOUT para STDERR e 3>&1 redirecionaria o fluxo 3 para STDERR. - Byte Commander
Apenas uma nota que '| &' não estava funcionando para mim no macOS. Isto é devido a ter uma versão mais antiga do bash (eu acho). O menos elegante '2> & 1 |' funciona bem embora - Danny Parker
E quanto a n, y, y? - user1133275
@Jas redireciona os fluxos stderr (2) e stdout (1). - Byte Commander


Você também pode usar tee para enviar a saída para um arquivo:

command | tee ~/outputfile.txt

Uma pequena modificação também irá capturar stderr:

command 2>&1 | tee ~/outputfile.txt

ou ligeiramente mais curto e menos complicado:

command |& tee ~/outputfile.txt

tee é útil se você quiser ser capaz de capturar a saída do comando enquanto também o exibe ao vivo.


81
2018-06-20 04:45



tee é útil se você quiser capturar a saída do comando enquanto a exibe ao vivo. Faça esta linha negrito Aaron Ele fará dois trabalhos de cada vez. Obrigado pela resposta. - learner
Ele diz que o & é inesperado e não grava o log ao mesmo tempo em que o comando é executado. Eu estou usando isso em um arquivo bash no entanto, isso faz alguma diferença? - tim687
@ tim687 Eu removi essa edição. Desculpe por isso ... não fazia parte da minha resposta original. - Aaron
@Aaron Obrigado! tee irá anexar o arquivo em tempo real, certo? Eu tenho um script de backup que eu uso para, lol, backup meu pc, mas o log não é em tempo real. Meu pc vai dormir depois que o backup é concluído e o arquivo de log está vazio. Devo usar outro comando para registrar os comandos? - tim687
bilhão obrigado mano - Mahesha999


Você pode redirecionar a saída do comando para um arquivo:

your_command >/path/to/file

Para anexar a saída do comando a um arquivo em vez de sobrescrevê-lo, use:

your_command >>/path/to/file

17
2018-02-14 19:52



Muito obrigado ! há algum limite? como o tamanho máximo do arquivo? - led-Zepp
O tamanho máximo do arquivo é limitado apenas pelo sistema de arquivos - chaos
Esta resposta não salvará stderr. Use &>, consulte stackoverflow.com/questions/637827/… e tldp.org/LDP/abs/html/io-redirection.html - Panther
O OP nunca pediu para salvar stderr - chaos


Um aprimoramento a considerar -

Vários scripts irão injetar códigos de cores na saída que você pode não querer desordenar o seu arquivo de log.

Para corrigir isso, você pode usar o programa sed para remover esses códigos. Exemplo:

command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt

11
2017-07-08 20:57



Como salvar a saída de forma que as cores sejam conservadas? Eu gostaria de importar o resultado de um comando no libreoffice e manter as cores. - madrang
@madrang: Eu só li o seu comentário agora, mas você pode achar isso responda útil. - Sylvain Pineau
Oh, quase exatamente o que estou procurando. Como imprimir também na tela a saída? - Sigur
Observe que muitos comandos que produzem saída colorida, como ls e grep, Apoio, suporte --color=auto, que produz códigos de cores somente se a saída padrão for um terminal. - Eliah Kagan


Para cron empregos etc você quer evitar as extensões Bash. O POSIX equivalente sh operadores de redirecionamento são

Bash            POSIX
--------------  --------------
foo &> bar      foo >bar 2&>1
foo &>> bar     foo >>bar 2>&1
foo |& bar      foo 2>&1 | bar

Você notará que o recurso POSIX é, de alguma forma, mais simples e mais direto. o &> sintaxe foi emprestado de csh que já deve convencê-lo de que é uma má ideia.


1
2018-04-11 12:25





some_command | tee command.log e some_command > command.log tem o problema que eles não salvam a saída do comando para o command.log arquivo em tempo real.

Para evitar esse problema e salvar a saída do comando em tempo real, você pode anexar unbuffer, que vem com o expect pacote.


Exemplo:

sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log

Assumindo log.py contém:

import time
print('testing')
time.sleep(100) # sleeping for 100 seconds

você pode correr unbuffer python log.py | tee command.log ou unbuffer python log.py > command.log

Mais Informações: Como posso salvar uma saída de comando em um arquivo em tempo real?


0
2017-07-04 20:54



Eles salvam a saída como eles a recebem, o problema é que o python ativa o buffer quando a saída não é para um TTY. Outras opções para desabilitar isso no Python: stackoverflow.com/q/107705/2072269 - muru