Comment enregistrer la sortie du terminal dans un fichier?

Comment enregistrer la sortie d'une commande dans un fichier?

Y a-t-il un moyen sans utiliser de logiciel? J'aimerais savoir comment.

Oui c'est possible, il suffit de rediriger la sortie (AKA stdout) à un fichier:

SomeCommand > SomeFile.txt  

Ou si vous souhaitez ajouter des données:

SomeCommand >> SomeFile.txt

Si tu veux stderr aussi bien utiliser ceci:

SomeCommand &> SomeFile.txt  

ou ceci à ajouter:

SomeCommand &>> SomeFile.txt  

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

SomeCommand 2>&1 | tee SomeFile.txt

(Si vous voulez uniquement la sortie, supprimez le 2 surtout)

Pour écrire la sortie d'une commande dans un fichier, il existe essentiellement 10 méthodes couramment utilisées.

Aperçu:

Veuillez noter que le n.e. dans la colonne de syntaxe signifie "non existant".
Il y a un moyen, mais c'est trop compliqué pour rentrer 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é uniquement vers le fichier, 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é uniquement vers le fichier, 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 qui permet de diriger uniquement StdErr vers une deuxième commande, ce qui serait nécessaire ici en combinaison avec tee encore une fois pour compléter le tableau. Si vous avez vraiment besoin de quelque chose comme ça, veuillez regarder "Comment canaliser stderr et non stdout?"sur le débordement de pile pour certaines façons, cela peut être fait, par exemple en échangeant des flux ou en utilisant la substitution de processus.

  • command |& tee output.txt

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

  • command |& tee -a output.txt

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

Vous pouvez également utiliser tee pour envoyer la sortie à un fichier:

command | tee ~/outputfile.txt

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

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

ou un peu plus court et moins compliqué:

command |& tee ~/outputfile.txt

tee est utile si vous voulez pouvoir capturez la sortie de la commande tout en la visualisant en direct.

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

your_command >/path/to/file

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

your_command >>/path/to/file

Une amélioration à considérer -

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

Pour résoudre ce problème, vous pouvez utiliser le programme SED pour supprimer 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

Il y a deux questions différentes ici. Le premier est dans le titre:

Comment enregistrer la sortie du terminal dans un fichier?

La deuxième question est dans le corps:

Comment enregistrer la sortie d'une commande dans un fichier?

Toutes les réponses publiées ici traitent de la deuxième question, mais aucune ne traite de la première question qui a une excellente réponse dans Unix et Linux:

Cette réponse utilise une commande peu connue appelée script qui enregistre toutes les sorties de votre shell dans un fichier texte jusqu'à ce que vous tapiez exit. La sortie de la commande apparaît toujours sur votre écran mais apparaît également dans le fichier texte.

Le processus est simple. Utiliser:

$ script ~/outputfile.txtScript started, file is /home/rick/outputfile.txt$ command1$ command2$ command3$ exitexitScript done, file is /home/rick/outputfile.txt

Ensuite, regardez votre sortie enregistrée des commandes 1, 2 et 3 avec:

cat ~/outputfile.txt

Ceci est similaire à réponse antérieure de:

command |& tee ~/outputfile.txt
  • Mais vous n'êtes pas obligé d'utiliser |& tee ~/outputfile.txt après chaque commnd.
  • Le script la commande a ajouté l'avantage (ou l'inconvénient) du rechargement ~/.bashrc quand ça commence.
  • Le script commande affiche l'invite de commande ($PS1) suivi de la(des) commande (s) que vous avez saisie (s).
  • Le script la commande enregistre tous les détails en couleur.

Pour cron vous voulez éviter les extensions Bash. L'équivalent POSIX sh les opérateurs de redirection sont

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

Vous remarquerez que l'installation POSIX est en quelque sorte plus simple et plus directe. Le &> la syntaxe a été empruntée à csh ce qui devrait déjà vous convaincre que c'est une mauvaise idée.

some_command | tee command.log et some_command > command.log ont le problème qu'ils n'enregistrent pas la sortie de la commande dans le command.log fichier en temps réel.

Pour éviter ce problème et enregistrer la sortie de la commande en temps réel, vous pouvez ajouter unbuffer, qui vient avec le expect paquet.


Exemple:

sudo apt-get install expectunbuffer some_command | tee command.logunbuffer some_command > command.log

Supposer log.py contenir:

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

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

Plus d'informations: Comment puis-je enregistrer une sortie de commande dans un fichier en temps réel?

Si vous souhaitez afficher le fichier pendant l'exécution de la commande:

script -c ./path/to/executable.bash -f log.txt