Como eu salvo a saída do terminal em um arquivo?

344

Como eu salvo a saída de um comando em um arquivo?

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

    
por led-Zepp 14.02.2014 / 20:49

6 respostas

349

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

someCommand > someFile.txt  

Ou se você deseja anexar dados:

someCommand >> someFile.txt

Se você quiser que o stderr também use:

someCommand &> someFile.txt  

ou isto para acrescentar:

someCommand &>> someFile.txt  
    
por Seth 14.02.2014 / 20:52
454

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 da 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 possui uma sintaxe abreviada que permita canalizar apenas o StdErr para 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 para "Como canalizar stderr, e não stdout?" no Stack Overflow para algumas maneiras como isso pode ser feito 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.

por Byte Commander 08.02.2016 / 15:52
75

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

command | tee ~/outputfile.txt

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

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

ou um pouco mais curto e menos complicado:

command |& tee ~/outputfile.txt

tee é útil se você quiser capturar a saída do comando enquanto a exibe ao vivo .

    
por Aaron 20.06.2014 / 06:45
16

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
    
por chaos 14.02.2014 / 20:52
10

Um aprimoramento a ser considerado -

Vários scripts injetam códigos de cores na saída, o que você pode não querer sobrecarregar 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 "3")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt
    
por Sean Huber 08.07.2014 / 22:57
0

Para cron jobs etc, você deseja evitar as extensões Bash. Os operadores de redirecionamento% POSI sh equivalentes 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 direto. A sintaxe &> foi emprestada de csh , o que já deve convencê-lo de que é uma má ideia.

    
por tripleee 11.04.2018 / 14:25