Как сохранить вывод команды в файл?
Есть ли способ без использования какого-либо программного обеспечения? Я хотел бы знать, как.
Да, это возможно, просто перенаправить вывод (AKA stdout
) в файл:
SomeCommand > SomeFile.txt
Или, если вы хотите добавить данные:
SomeCommand >> SomeFile.txt
Если вы хотите stderr
также используйте это:
SomeCommand &> SomeFile.txt
или это для добавления:
SomeCommand &>> SomeFile.txt
если вы хотите, чтобы в файле и в консоли отображались и stderr
и выводились , используйте следующее:
SomeCommand 2>&1 | tee SomeFile.txt
(Если вы хотите, чтобы выводились только данные, опустите 2
выше)
Чтобы записать вывод команды в файл, существует 10 обычно используемых способов.
Обратите внимание, что
н.э.
в столбце синтаксиса означает «не существует».
Способ есть, но он слишком сложен, чтобы поместиться в столбец. Вы можете найти полезную ссылку об этом в разделе «Список».
|| 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
команда> 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 во вторую команду, которая может понадобиться здесь в комбинации с тройником
еще раз, чтобы заполнить таблицу. Если вам действительно нужно что-то подобное, пожалуйста, посмотрите "Как передать stderr, а не stdout?" в Stack Overflow , чтобы узнать, как это можно сделать, например путем обмена потоками или с помощью подстановки процессов.
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
полезен, если вы хотите иметь возможность захватывать выходные данные команд, одновременно просматривая их в реальном времени .
Вы можете перенаправить вывод команды в файл:
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
Для заданий 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
, что уже должно убедить вас в том, что это плохая идея.
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
Дополнительная информация: Как сохранить вывод команды в файл в реальном времени?
Здесь есть два разных вопроса. Первый находится в заголовке:
Как мне сохранить вывод терминала в файл?
Второй вопрос находится в теле:
Как сохранить вывод команды в файл?
Все ответы, размещенные здесь, относятся ко второму вопросу, но ни один не касается первого вопроса, на который есть отличный ответ в 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
после каждой команды
. script
имеет дополнительные преимущества (или недостатки) перезагрузки ~ / .bashrc
при запуске. script
показывает командную строку ( $ PS1
), за которой следуют введенные вами команды. Команда script
записывает все подробности в полном цвете.