Como salvar a saída do terminal em um arquivo?

690

Como salvar a saída de um comando em um arquivo?

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

led-Zepp
fonte

Respostas:

737

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

SomeCommand > SomeFile.txt  

Ou se você deseja anexar dados:

SomeCommand >> SomeFile.txt

Se você também deseja stderrusar isso:

SomeCommand &> SomeFile.txt  

ou isto para acrescentar:

SomeCommand &>> SomeFile.txt  

se você deseja stderrexibir os dois e a saída no console e em um arquivo, use este:

SomeCommand 2>&1 | tee SomeFile.txt

(Se você deseja apenas a saída, solte a opção 2acima)

Seth
fonte
15
Observe que someCommand 2> someFile.txte someCommand 2>> someFile.txttambém redireciona stterrpara someFile.txt
Slothworks 29/08
Estou tentando fazer isso com o comando gcc, mas não funciona. Funciona com outros comandos, mas não com este. Ele simplesmente cria o arquivo de saída sem nada dentro dele.
Nikos
@ Nik-Lz Geralmente, isso ocorre porque o comando está enviando toda a sua saída no stderr. Se o gcc estiver gerando mensagens de erro, isso parece provável. Veja o comentário do Slothworks para saber como capturar stderr em vez de stdout.
9788 Jonathan -Jackley-
1
Nota: para obter a saída do makecomando em um arquivo, é necessário esta sintaxe: make > someFile.txt 2>&1(fonte: linuxquestions.org/questions/linux-newbie-8/… )
Gabriel Staples
Eu tenho um problema que para de gravar quando o arquivo atinge cerca de 8 MB. Esse limite é conhecido?
RelGest
865

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

Visão global:

Observe que a n.e.coluna na sintaxe significa "não existente".
Existe uma maneira, mas é muito complicado caber na coluna. Você pode encontrar um link útil na seção Lista sobre ele.

          || 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 estará visível no terminal. Se o arquivo já existir, ele será substituído.

  • command >> output.txt

    O fluxo de saída padrão será redirecionado apenas para o arquivo, não estará 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 estará visível no terminal. Se o arquivo já existir, ele será substituído.

  • command 2>> output.txt

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

  • command &> output.txt

    A saída padrão e o fluxo de erros padrão serão redirecionados apenas para o arquivo, nada será visível no terminal. Se o arquivo já existir, ele será substituído.

  • command &>> output.txt

    A saída padrão e o fluxo de erros 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, ainda estará visível no terminal. Se o arquivo já existir, ele será substituído.

  • command | tee -a output.txt

    O fluxo de saída padrão será copiado para o arquivo, 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 sintaxe abreviada que permite canalizar apenas StdErr para um segundo comando, o que seria necessário aqui em combinação com teenovamente para concluir a tabela. Se você realmente precisa de algo assim, consulte "Como canalizar stderr, e não stdout?" no Stack Overflow, de algumas maneiras, como isso pode ser feito, por exemplo, trocando fluxos ou usando a substituição de processo.

  • command |& tee output.txt

    A saída padrão e 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á substituído.

  • command |& tee -a output.txt

    A saída padrão e 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.

Byte Comandante
fonte
66
Obrigado pela mesa, é excelente! Esta deve ser a resposta superior
DevShark
3
@ karthick87 Isso não está realmente relacionado à questão de redirecionar a saída para um arquivo, porque apenas redireciona um fluxo para outro. 2>&1redireciona STDERR para STDOUT, 1>&2redireciona STDOUT para STDERR e 3>&1redireciona o fluxo 3 para STDERR.
Byte Commander
18
Apenas uma observação de que '| &' não estava funcionando para mim no macOS. Isso ocorre porque ele possui uma versão mais antiga do bash (eu acho). Os menos elegantes '2> & 1 |' funciona bem embora
Danny Parker
2
@ByteCommander Recebo o erro: sh: 1: Syntax error: "&" unexpectedquando uso |& teede um script Python em um servidor c9.io. Parece que um shell diferente está sendo usado. echo $SHELLmostra /bin/bashe $SHELL --versionmostra a versão 4.3.11 (1) - liberação. Eu tentei #!/bin/bashno meu script python, mas ainda assim sh: 1: Syntax error. Eu consegui o que precisava, então estou desistindo de classificar a estranheza entre she bashno meu servidor. Obrigado.
precisa saber é o seguinte
1
@ samkhan13 parece que você está executando she não bash(ou talvez bashno shmodo ...). Você pode verificar exatamente o que seu processo de shell atual está usando ps -p $$ -o cmd=, porque echo $SHELLnão é confiável e mostrará seu shell de login, ignorando se você pode ter iniciado um subshell diferente.
Byte Commander
108

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

command | tee ~/outputfile.txt

Uma leve 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ê deseja capturar a saída do comando enquanto a exibe ao vivo .

Aaron
fonte
Ele diz que o & é inesperado e não grava o log ao mesmo tempo 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 Thanks! tee anexará o arquivo em tempo real, certo? Eu tenho um script de backup que eu uso para, lol, fazer backup do meu pc, mas o log não é em tempo real. Meu PC entra no modo de suspensão após a conclusão do backup e o arquivo de log está vazio. Devo usar outro comando para registrar os comandos?
tim687
como interpreto o significado de 2>&1?
Mahesha999
@ Mahesha999 2 é o descritor de arquivo para STDERR e 1 é para STDOUT. Para que 2> & 1 envie STDERR para STDOUT. Esta questão SO explica isso muito bem: stackoverflow.com/questions/818255/...
Aaron
20

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

your_command >/path/to/file

Para acrescentar a saída do comando a um arquivo em vez de substituí-lo, use:

your_command >>/path/to/file
caos
fonte
Muito obrigado ! existe algum limite? como o tamanho máximo do arquivo?
led-Zepp
3
O tamanho máximo de arquivo é apenas limitado pelo sistema de arquivos
caos
Esta resposta não salvará o stderr. Use &>, consulte stackoverflow.com/questions/637827/… e tldp.org/LDP/abs/html/io-redirection.html
Panther
3
O OP nunca pediu para salvar stderr
caos
Ele diz "Não existe esse arquivo ou diretório". Também é possível criar os diretórios automaticamente?
Qwerty
14

Uma melhoria a considerar -

Vários scripts injetam códigos de cores na saída, que você pode não querer desorganizar no 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
Sean Huber
fonte
1
Como salvar a saída de maneira que as cores sejam conservadas? 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 encontrar esta resposta útil.
21415 Sylvain Pineau
Ah, quase exatamente o que estou procurando. Como imprimir também na tela a saída?
Sigur
1
Observe que muitos comandos que produzem saída colorida, como lse grep, suportam --color=auto, que emitem códigos de cores somente se a saída padrão for um terminal.
Eliah Kagan
5

Para crontrabalhos, etc, você deseja evitar as extensões do Bash. Os shoperadores de redirecionamento POSIX 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 é, em certo sentido, mais simples e direto. A &>sintaxe foi emprestada da cshqual já deveria convencê-lo de que é uma má ideia.

triplo
fonte
1

some_command | tee command.loge some_command > command.logtenha o problema de que eles não salvam a saída do comando no command.logarquivo em tempo real.

Para evitar esse problema e salvar a saída do comando em tempo real, você pode anexar o unbufferque acompanha o expectpacote.


Exemplo:

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

Supondo que log.pycontenha:

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

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

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

Franck Dernoncourt
fonte
Eles salvam a saída conforme 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