Comment enregistrer la sortie du terminal dans un fichier?

690

Comment enregistrer le résultat d'une commande dans un fichier?

Existe-t-il un moyen d'utiliser aucun logiciel? J'aimerais savoir comment.

led-Zepp
la source

Réponses:

737

Oui c'est possible, il suffit de rediriger la sortie vers un fichier:

SomeCommand > SomeFile.txt  

Ou si vous souhaitez ajouter des données:

SomeCommand >> SomeFile.txt

Si vous voulez stderraussi utiliser ceci:

SomeCommand &> SomeFile.txt  

ou ceci pour ajouter:

SomeCommand &>> SomeFile.txt  

si vous voulez avoir les deux stderret la sortie affichés sur la console et dans un fichier, utilisez ceci:

SomeCommand 2>&1 | tee SomeFile.txt

(Si vous ne voulez que la sortie, supprimez ce qui 2précède)

Seth
la source
15
Notez que someCommand 2> someFile.txtet someCommand 2>> someFile.txtredirige également vers stterrsomeFile.txt
Slothworks
J'essaie de faire cela avec la commande gcc mais cela ne fonctionne pas. Cela fonctionne avec d'autres commandes, mais pas celle-ci. Il crée simplement le fichier de sortie avec rien à l'intérieur.
Nikos
@ Nik-Lz C'est souvent parce que la commande envoie toute sa sortie sur stderr. Si gcc génère des messages d'erreur, cela semble probable. Voir le commentaire de Slothworks pour savoir comment capturer stderr au lieu de stdout.
Jonathan Hartley
1
NB: pour obtenir le résultat de la makecommande dans un fichier, cette syntaxe requiert la syntaxe suivante: make > someFile.txt 2>&1(source: linuxquestions.org/questions/linux-newbie-8/… )
Gabriel Staples
J'ai un problème qui cesse d'écrire lorsque le fichier atteint environ 8 Mo. Est-ce une limite connue?
relG
866

Pour écrire le résultat d’une commande dans un fichier, il existe 10 méthodes couramment utilisées.

Vue d'ensemble:

Veuillez noter que la n.e.colonne dans la syntaxe signifie "non existant".
Il y a un moyen, mais c'est trop compliqué à intégrer dans la colonne. Vous pouvez trouver un lien utile dans la section Liste à ce sujet.

          || 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

Liste:

  • command > output.txt

    Le flux de sortie standard sera redirigé vers le fichier uniquement, il ne sera pas visible dans le terminal. Si le fichier existe déjà, il est écrasé.

  • command >> output.txt

    Le flux de sortie standard sera redirigé vers le fichier uniquement, il ne sera pas visible dans le terminal. Si le fichier existe déjà, les nouvelles données seront ajoutées à la fin du fichier.

  • command 2> output.txt

    Le flux d'erreur standard sera redirigé vers le fichier uniquement, il ne sera pas visible dans le terminal. Si le fichier existe déjà, il est écrasé.

  • command 2>> output.txt

    Le flux d'erreur standard sera redirigé vers le fichier uniquement, il ne sera pas visible dans le terminal. Si le fichier existe déjà, les nouvelles données seront ajoutées à la fin du fichier.

  • command &> output.txt

    La sortie standard et le flux d'erreur standard seront redirigés vers le fichier uniquement, rien ne sera visible dans le terminal. Si le fichier existe déjà, il est écrasé.

  • command &>> output.txt

    La sortie standard et le flux d'erreur standard seront redirigés vers le fichier uniquement, rien ne sera visible dans le terminal. Si le fichier existe déjà, les nouvelles données seront ajoutées à la fin du fichier.

  • command | tee output.txt

    Le flux de sortie standard sera copié dans le fichier, il sera toujours visible dans le terminal. Si le fichier existe déjà, il est écrasé.

  • command | tee -a output.txt

    Le flux de sortie standard sera copié dans le fichier, il sera toujours visible dans le terminal. Si le fichier existe déjà, les nouvelles données seront ajoutées à la fin du fichier.

  • (*)

    Bash n'a pas de syntaxe abrégée permettant de ne lier que StdErr à une deuxième commande, ce qui serait nécessaire ici en combinaison avec à teenouveau pour compléter le tableau. Si vous avez vraiment besoin de quelque chose comme ça, regardez s'il vous plaît "Comment faire pour canaliser stderr, et pas stdout?" sur le dépassement de pile pour certaines raisons, par exemple en échangeant des flux ou en utilisant un processus de substitution.

  • command |& tee output.txt

    La sortie standard et les flux d'erreur standard seront copiés dans le fichier tout en restant visibles dans le terminal. Si le fichier existe déjà, il est écrasé.

  • command |& tee -a output.txt

    La sortie standard et les flux d'erreur standard seront copiés dans le fichier tout en restant visibles dans le terminal. Si le fichier existe déjà, les nouvelles données seront ajoutées à la fin du fichier.

Byte Commander
la source
66
Merci pour la table, c'est excellent! Cela devrait être une
bonne
3
@ karthick87 Cela n'est pas vraiment lié à la question de la redirection de la sortie vers un fichier, car elle redirige simplement un flux vers un autre. 2>&1redirige STDERR vers STDOUT, 1>&2redirige STDOUT vers STDERR et 3>&1redirige le flux 3 vers STDERR.
Byte Commander
18
Juste une note que '| &' ne fonctionnait pas pour moi sur macOS. Cela est dû au fait qu’elle possède une version plus ancienne de bash (je pense). Le moins élégant '2> & 1 |' fonctionne bien cependant
Danny Parker
2
@ByteCommander J'obtiens l'erreur suivante: sh: 1: Syntax error: "&" unexpectedlorsque j'utilise |& teeun script Python sur un serveur c9.io. Il semble qu'une coquille différente est utilisée. echo $SHELLmontre /bin/bashet $SHELL --versionmontre la version 4.3.11 (1) -release. J'ai essayé #!/bin/bashdans mon script python mais je comprends toujours sh: 1: Syntax error. J'ai eu ce dont j'avais besoin alors je renonce à trier l'étrangeté entre shet bashsur mon serveur. Merci.
Samkhan13
1
@ samkhan13 semble que vous courez shet non bash(ou peut-être bashen shmode ...). Vous pouvez vérifier ce que votre processus de shell actuel utilise exactement ps -p $$ -o cmd=, car il echo $SHELLest peu fiable et vous montrera votre shell de connexion, en ignorant si vous avez peut-être démarré un sous-shell différent.
Byte Commander
108

Vous pouvez également utiliser teepour envoyer la sortie dans un fichier:

command | tee ~/outputfile.txt

Une légère modification attirera également stderr:

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

ou légèrement plus court et moins compliqué:

command |& tee ~/outputfile.txt

teeest utile si vous voulez pouvoir capturer la sortie de la commande tout en la visualisant en direct .

Aaron
la source
Il indique que le & est inattendu et n'écrit pas le journal en même temps que la commande est exécutée. J'utilise ceci dans un fichier bash, est-ce que cela fait une différence?
tim687
@ tim687 J'ai supprimé cette édition. Désolé pour ça ... ne faisait pas partie de ma réponse initiale.
Aaron
@ Aaron Merci! tee ajoutera le fichier en temps réel, non? J'ai un script de sauvegarde que j'utilise pour, lol, sauvegarder mon pc, mais la journalisation n'est pas en temps réel. Mon ordinateur se met en veille une fois la sauvegarde terminée et le fichier journal est vide. Devrais-je utiliser une autre commande pour enregistrer les commandes?
tim687
Comment interpréter le sens de 2>&1?
Mahesha999
@ Mahesha999 2 est le descripteur de fichier pour STDERR et 1 pour STDOUT. Alors que 2> & 1 envoie STDERR à STDOUT. Cette question SO explique assez bien: stackoverflow.com/questions/818255/…
Aaron
20

Vous pouvez rediriger la sortie de la commande vers un fichier:

your_command >/path/to/file

Pour ajouter le résultat de la commande à un fichier au lieu de l'écraser, utilisez:

your_command >>/path/to/file
le chaos
la source
Merci beaucoup ! Y a-t-il des limites? comme la taille maximale du fichier?
led-Zepp
3
La taille maximale du fichier est simplement limitée par le système de fichiers
chaos
Cette réponse ne sauvera pas stderr. Utilisez &>, voir stackoverflow.com/questions/637827/… et tldp.org/LDP/abs/html/io-redirection.html
Panther
3
Le PO n'a jamais demandé de sauver stderr
chaos
Il dit "Aucun fichier ou répertoire de ce type". Est-il possible de créer également les répertoires automatiquement?
Qwerty
14

Une amélioration à considérer -

Divers scripts introduiront dans la sortie des codes de couleur que vous ne voudrez peut-être pas encombrer dans votre fichier journal.

Pour résoudre ce problème, vous pouvez utiliser le programme sed pour effacer ces codes. Exemple:

command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt
Sean Huber
la source
1
Comment enregistrer la sortie de manière à conserver les couleurs? Je voudrais importer le résultat d'une commande dans libreoffice et garder les couleurs.
madrang
@madrang: Je ne lis que votre commentaire maintenant, mais vous trouverez peut-être cette réponse utile.
Sylvain Pineau
Oh, presque exactement ce que je cherche. Comment imprimer aussi à l'écran la sortie?
Sigur
1
Notez que de nombreuses commandes produisant une sortie colorisée, telles que lset grep, prennent en charge --color=autoles codes de couleur uniquement si la sortie standard est un terminal.
Eliah Kagan
5

Pour les crontâches, etc., vous voulez éviter les extensions Bash. Les shopérateurs de redirection POSIX équivalents sont

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

Vous remarquerez que l'utilitaire POSIX est en quelque sorte plus simple et plus simple. La &>syntaxe a été empruntée à cshlaquelle devrait déjà vous convaincre que c'est une mauvaise idée.

triple
la source
1

some_command | tee command.loget some_command > command.logle problème est qu'ils n'enregistrent pas la sortie de la commande dans le command.logfichier en temps réel.

Pour éviter ce problème et enregistrer le résultat de la commande en temps réel, vous pouvez ajouter unbuffer, fourni avec le expectpackage.


Exemple:

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

En supposant que log.pycontient:

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

tu peux courir unbuffer python log.py | tee command.logouunbuffer python log.py > command.log

Informations complémentaires : Comment enregistrer une sortie de commande dans un fichier en temps réel?

Franck Dernoncourt
la source
Ils enregistrent la sortie au fur et à mesure de leur réception, le problème est que python active la mise en mémoire tampon lorsque la sortie ne correspond pas à un TTY. Autres options pour désactiver cela en Python: stackoverflow.com/q/107705/2072269
muru