Как сохранить вывод терминала в файл?

Как сохранить вывод команды в файл?

Есть ли способ без использования какого-либо программного обеспечения? Я хотел бы знать, как.

10 ответов

Решение

Да, это возможно, просто перенаправить вывод в файл:

SomeCommand > SomeFile.txt  

Или, если вы хотите добавить данные:

SomeCommand >> SomeFile.txt

Если ты хочешь stderr а также используйте это:

SomeCommand &> SomeFile.txt  

или это добавить:

SomeCommand &>> SomeFile.txt  

если вы хотите иметь оба stderr и вывод на консоль и в файл использовать это:

SomeCommand 2>&1 | tee SomeFile.txt

(Если вы хотите только вывод, бросьте 2 выше)

Чтобы записать вывод команды в файл, существует в основном 10 часто используемых способов.

Обзор:

Обратите внимание, что n.e. в столбце синтаксиса означает "не существует".
Есть способ, но он слишком сложен, чтобы вписаться в колонку. Вы можете найти полезную ссылку в разделе "Список".

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

Список:

  • command > output.txt

    Стандартный поток вывода будет перенаправлен только в файл, он не будет виден в терминале. Если файл уже существует, он перезаписывается.

  • command >> output.txt

    Стандартный поток вывода будет перенаправлен только в файл, он не будет виден в терминале. Если файл уже существует, новые данные будут добавлены в конец файла.

  • command 2> output.txt

    Стандартный поток ошибок будет перенаправлен только в файл, он не будет виден в терминале. Если файл уже существует, он перезаписывается.

  • command 2>> output.txt

    Стандартный поток ошибок будет перенаправлен только в файл, он не будет виден в терминале. Если файл уже существует, новые данные будут добавлены в конец файла.

  • command &> output.txt

    И стандартный вывод, и стандартный поток ошибок будут перенаправлены только в файл, в терминале ничего не будет видно. Если файл уже существует, он перезаписывается.

  • command &>> output.txt

    И стандартный вывод, и стандартный поток ошибок будут перенаправлены только в файл, в терминале ничего не будет видно. Если файл уже существует, новые данные будут добавлены в конец файла.

  • command | tee output.txt

    Стандартный поток вывода будет скопирован в файл, он все равно будет виден в терминале. Если файл уже существует, он перезаписывается.

  • command | tee -a output.txt

    Стандартный поток вывода будет скопирован в файл, он все равно будет виден в терминале. Если файл уже существует, новые данные будут добавлены в конец файла.

  • (*)

    Bash не имеет сокращенного синтаксиса, который позволяет передавать только StdErr для второй команды, которая необходима здесь в сочетании с tee снова, чтобы заполнить таблицу. Если вам действительно нужно что-то подобное, пожалуйста, посмотрите на "Как транслировать stderr, а не stdout?" Переполнение стека для некоторых способов, как это можно сделать, например, путем обмена потоками или с помощью подстановки процесса.

  • command |& tee output.txt

    Как стандартный вывод, так и стандартные потоки ошибок будут скопированы в файл, пока они будут видны в терминале. Если файл уже существует, он перезаписывается.

  • command |& tee -a output.txt

    Как стандартный вывод, так и стандартные потоки ошибок будут скопированы в файл, пока они будут видны в терминале. Если файл уже существует, новые данные будут добавлены в конец файла.

Вы также можете использовать tee чтобы отправить вывод в файл:

command | tee ~/outputfile.txt

Небольшая модификация также поймает stderr:

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

или немного короче и менее сложный:

command |& tee ~/outputfile.txt

tee полезно, если вы хотите иметь возможность записывать вывод команды, а также просматривать ее в режиме реального времени.

Здесь есть два разных вопроса. Первый в названии:

Как сохранить вывод терминала в файл?

Второй вопрос в теле:

Как сохранить вывод команды в файл?

Все ответы, размещенные здесь, относятся ко второму вопросу, но ни один из них не касается первого вопроса, на который есть отличный ответ в Unix и Linux:

В этом ответе используется малоизвестная команда под названием script который сохраняет весь вывод вашей оболочки в текстовый файл, пока вы не наберете exit. Вывод команды по-прежнему отображается на вашем экране, но также появляется в текстовом файле.

Процесс прост. Использование:

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

Затем посмотрите на записанный вами вывод команд 1, 2 и 3:

cat ~/outputfile.txt

Это похоже на предыдущий ответ:

command |& tee ~/outputfile.txt
  • Но вам не обязательно использовать |& tee ~/outputfile.txt после каждого commnd.
  • В script команда имеет дополнительное преимущество (или недостаток) перезагрузки ~/.bashrc когда он начнется.
  • В script команда показывает командную строку ($PS1), за которым следуют введенные вами команды.
  • В script Команда записывает все детали в полном цвете.

Вы можете перенаправить вывод команды в файл:

your_command >/path/to/file

Чтобы добавить вывод команды в файл вместо перезаписи, используйте:

your_command >>/path/to/file

Улучшение, чтобы рассмотреть -

Различные сценарии будут вводить цветовые коды в вывод, который может не захламлять ваш файл журнала.

Чтобы это исправить, вы можете использовать программу sed для удаления этих кодов. Пример:

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

some_command | tee command.log а также some_command > command.log есть проблема, что они не сохраняют вывод команды в command.log файл в режиме реального времени.

Чтобы избежать этой проблемы и сохранить вывод команды в режиме реального времени, вы можете добавить unbuffer, который идет с expect пакет.


Пример:

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

Если предположить, log.py содержит:

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

Вы можете запустить unbuffer python log.py | tee command.log или же unbuffer python log.py > command.log

Дополнительная информация: Как я могу сохранить вывод команды в файл в режиме реального времени?

За cron задания и т. д. вы хотите избежать расширений Bash. Эквивалент POSIX sh операторы перенаправления

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

Вы заметите, что средство POSIX в некотором смысле проще и понятнее. &> Синтаксис был заимствован из csh который уже должен убедить вас, что это плохая идея.

Если вы хотите вывести в файл во время выполнения команды:

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

Используйте возможности эмулятора терминала

Еще не упомянутый вариант, который также может сохранять цвета / цвета, заключается в использовании консольной программы, такой как Konsole(эмулятор терминала KDE/Plasma по умолчанию) — для сохранения вывода.

консоль

      Konsole has: 
File > Save output as... 

ярлык Ctrl+ Shift+ S; это позволяет сохранить вывод в виде текстового файла или HTML, включая цвета! Я не уверен точно, сколько это сэкономит, но в моем тесте он включал только ~ 1000, всю прокрутку терминала (вы можете увеличить буфер, создав новый профиль, Профиль> Новый..., а затем изменить прокрутку настройки, чтобы захватывать больше; версия Konsole 4:21.08.1).

гном-терминал

gnome-terminalтакже имеет «копировать вывод как HTML», что позволяет вставлять HTML в документ; он сохраняет цвет, но копирует только содержимое вывода, отображаемого в данный момент на экране AFAICT.

вообще

Вы можете, конечно, сделать прямое перетаскивание (удерживая левую кнопку мыши во время перетаскивания), а затем скопировать (ctrl+c, Правка > Копировать или щелкнуть правой кнопкой мыши и выбрать копирование).

другие?

Не стесняйтесь изменить этот ответ, включив в него другие популярные терминальные приложения. Мой любимый, Yakuake, похоже, не имеет этой функции, как и большинство популярных терминалов, которые я рассмотрел, включая terminal.app и Hyper.

Другие вопросы по тегам