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

Любой начинающий системный администратор Linux рано или поздно сталкивается с таким понятием, как “скрипт ”, будь то один из загрузочных скриптов вроде /etc/rc.d/rc или написанный разработчиком ПО скрипт конфигурирования configure . В данной статье я постараюсь показать, что написание скриптов на shell не является чем-то из ряда вон выходящим и вполне под силу даже новичку в мире Linux.

Как посмотреть содержимое папки с помощью команды echo

Сперва разберёмся с работой с файловой системой с помощью команды echo. В Linux есть конечно более удобные функции для работы со списком файлов и директорий. Команду tree мы рассмотрели ранее в → этой статье. Есть совсем заточенная только для этого команда ls. Но если хочется в Bash да ещё и командой echo вывести список файлов, то делается это просто:

[email protected]:~# echo *

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

[email protected]:~# echo *.sh

Как-то так, но я предпочитаю для этих целей всё-таки пользоваться стандартной утилитой ls.

Простейшие скрипты

В данном HOW-TO осуществляется попытка предоставить Вам некоторые рекомендации по shell-программированию, основанные только на примерах.

В данном разделе Вы обнаружите небольшие скрипты, которые, вероятно, будут Вам полезны при освоении некоторых приёмов.

Традиционный скрипт «hello world»

#!/bin/bash echo Hello World!

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

Вторая строка — это единственное действие, выполняемое данным скриптом, печатающее «Hello world» на терминале.

Если Вы получите что-то типа./: Command not found. , то, возможно, первая строка «#!/bin/bash» неправильная; запустите whereis bash или посмотрите finding bash, чтобы выяснить, какой должна быть эта строка.

Читайте также:  9 самых популярных оболочек рабочего стола Linux

Вариант 2: перенаправляем вывод в файл и отображаем его на экране

Не всем и не всегда удобно пользоваться операторами > и >>, так как все же лучше когда волнение команд можно наблюдать в реальном времени в окне терминала. В таком случае мы можем воспользоваться командой tee, которая и отобразит выполнение команд на экране, и сохранит его в файл. Синтаксис ее такой:

команда | tee /путь/к/файлу

Этот вариант подобен оператору > из предыдущего пункта, то есть при записи в файл, все старые данные будут удалены. Если вам нужно дописать в файл, в конструкцию нужно добавить параметр -a:

команда | tee -a /путь/к/файлу

В Bash есть еще несколько операторов и команд, выполняющих идентичные задачи, их часто используют во время написания различных скриптов, но для обычного пользователя, которому нужно сохранить вывод команды чтобы запостить его на форуме, вполне достаточно и этих вариантов. Надеюсь, что помог вам, до новых постов!

Вариант 2: перенаправляем вывод в файл и отображаем его на экране

Предыдущая запись Как добавить пользователя в CentOS 7 Следующая запись Восстановление GRUB 2 после установки Windows в DebianМожет вас заинтересовать:

  1. Отключаем чувствительность терминала Linux к регистру при использовании автодополнения по TAB
  2. Как узнать версию дистрибутива и ядра Linux
  3. Как перезагрузить или выключить компьютер из терминала в Ubuntu
  4. Скринкастинг с помощью FFmpeg (avconv) в Linux

Метки Linux терминалХаки Linux

Небольшой пример сценария

Ниже приводится пример скрипта, ищущего все файлы журналов в директории /var/log . Если вызов происходит без указания параметров, имена всех журналов записываются в файл , лежащий в домашней директории пользователя. При указании строкового параметра поиск осуществляется по его вхождению в имена файлов. Данный Bash скрипт должен работать одинаково в любом дистрибутиве Linux.

#!/bin/bash if [ -n «$1» ]; then find /var/log -type f -name «*$1*.log» -print > ~/ echo «Осуществлен поиск по фразе «$1″» else find /var/log -type f -name «*.log» -print > ~/ echo «Поиск всех файлов журналов закончен» fi

Создайте в директории /usr/local/bin файл с именем findlog и скопируйте в него, приведенный выше программный код. Файл нужно сделать исполняемым с помощью команды chmod, или нажмите по нему правой кнопкой мыши и зайдите в пункт «свойства». В открывшемся окне выберите закладку «права» и активируйте переключатель «разрешить выполнение файла как программы». После данных операций вы сможете запускать сценарий в терминале с помощью указания его имени.

Читайте также:  Почему Linux лучше не использовать, как основную ОС

Sudo findlog «error» Осуществлен поиск по фразе «error» sudo findlog Поиск всех файлов журналов закончен

STDOUT

Итак, у нас есть некий файл с данными, к которому мы можем добавить другие данные с помощью этой команды:

Pwd >> myfile То, что выведет pwd , будет добавлено к файлу myfile , при этом уже имеющиеся в нём данные никуда не денутся.

Перенаправление вывода команды в файл

Пока всё хорошо, но что если попытаться выполнить что-то вроде показанного ниже, обратившись к несуществующему файлу xfile , задумывая всё это для того, чтобы в файл myfile попало сообщение об ошибке.

Ls –l xfile > myfile После выполнения этой команды мы увидим сообщения об ошибках на экране.

Попытка обращения к несуществующему файлу

При попытке обращения к несуществующему файлу генерируется ошибка, но оболочка не перенаправила сообщения об ошибках в файл, выведя их на экран. Но мы-то хотели, чтобы сообщения об ошибках попали в файл. Что делать? Ответ прост — воспользоваться третьим стандартным дескриптором.

Шаг Запись стандартного вывода и входных данных в один файл

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

ls /etc/hosts /etc/aircrack-ng > goodoutput 2 > & 1

Обратите внимание, что я не использовал значение 1 перед «> goodoutput», поскольку BASH по умолчанию использует stdout, если не указано конкретное число.

Надеюсь, вам понравился этот урок по Linux stdin, stdout и stderror, но у нас еще есть много чего нового и интересного, поэтому обязательно возвращайтесь!

Формат и правила набора

Общие правила

Команду можно копировать и вставить в терминал из браузера или документа. Для ее выполнения нужно указать в начале строки sudo.

При вводе команды вручную или копирования из источника необходимо активировать ее нажатием клавиши «Enter». Если работа в терминале только начинается, то нужно указать пароль, который при вводе не отображается.

Читайте также:  10 лучших сред разработки (IDE) для Linux

При наборе команды требуется соблюдать общий формат: file_name_program_or_comand_name -key value («file_name_program_or_comand_name» — имя файла программы или команды, «key» — ключ и «value» — значение).

Формат и правила набора
  • Ключ: параметр, указываемый после имени исполняемого файла или внутренней команды. Используется для указания настроек или действий, которые необходимо выполнить.
  • Значение: число или переменная, используемые при выполнении команды.

Ubuntu позволяет использовать пакетный файл, в котором прописывается последовательное выполнение команд. Для его создания требуется:

  1. открыть новый текстовый файл;
  2. указать в первой строке #!/bin/bash;
  3. ввести список команд в столбик, а затем сохранить изменения.

После этого в свойствах файла необходимо активировать флажок «Разрешить выполнение файла как программы» и закрыть окно.

При двойном нажатии левой кнопкой мыши произойдет активация скрипта. Ниже приведен пример пакетного файла, который модифицирует команду rm, удаляющую файлы.

Вышеописанный bash-скрипт создает папку «~/.archive» и перемещает в нее файлы, указывая в начале имени дату удаления.

Пакетный файл

Ubuntu позволяет использовать пакетный файл, в котором прописывается последовательное выполнение команд. Для его создания требуется:

Формат и правила набора
  1. открыть новый текстовый файл;
  2. указать в первой строке #!/bin/bash;
  3. ввести список команд в столбик, а затем сохранить изменения.

После этого в свойствах файла необходимо активировать флажок «Разрешить выполнение файла как программы» и закрыть окно.

При двойном нажатии левой кнопкой мыши произойдет активация скрипта. Пример пакетного файла, который модифицирует команду rm, удаляющую файлы.

Вышеописанный bash-скрипт создает папку «~/.archive» и перемещает в нее файлы, указывая в начале имени дату удаления.

Переход по директориям

В этом разделе вы познакомитесь с основными командами bash, которые позволят вам выполнять самые простые действия в командной строке. Команда cd позволяет переходить из одной директории в другую. При этом если вы используете команду без ключей, то попадете в домашнюю директорию; для того, чтобы перейти в какую-либо конкретную директорию, необходимо просто прописать ее путь, к примеру:

cd /home/users/dir1

Вы также можете указывать команду cd с определенными ключами:

cd ../.. — переход на две директории выше;

cd — — переход в предыдущую директорию (в которой вы были до перемещения в нынешнюю).

Команда pwd укажет путь той директории, в которой вы в данный момент находитесь.