Меню

Linux: перенаправления в командой строке (bash)

08.05.2018 - Bash, Linux
Linux: перенаправления в командой строке (bash)

Перенаправление

Общие команды

Важно

Согласно центральной идее Unix, что «все сущее есть файл», такие программы, как ls, в действительности выводят свои результаты в специальный файл, который называется стандартным выводом (standard output, часто обозначается как stdout), а сообщения о состоянии — в специальный файл стандартный вывод ошибок (standard error, stderr). По умолчанию оба файла, стандартный вывод и стандартный вывод ошибок, связаны с экраном и не сохраняются на диске.
Кроме того, многие программы принимают ввод из специального файла с названием стандартный ввод (standard input, stdin), который по умолчанию связан с клавиатурой.
Механизм перенаправления ввода/вывода позволяет изменять направление вывода и ввода. Обычно вывод осуществляется на экран, а ввод — с клавиатуры, но механизм перенаправления ввода/вывода позволяет изменить этот порядок вещей.

Перенаправление стандартного вывода

Чтобы перенаправить стандартный вывод в другой файл вместо экрана, нужно добавить в команду оператор перенаправления > и имя файла.
Например, можно сообщить командной оболочке, что она должна направить вывод команды ls в файл ls-output.txt вместо экрана:

$ ls /usr/bin > ls-output.txt

Так как оператор > каждый раз перезаписывает файл, то для создания файла, можно воспользоваться следующим трюком

$ > ls-output.xtx

Чтобы передать данные в конец файла без затирки — используется оператор >>
Пример

$ ls -l /usr/bin >> ls-output.txt

Если файл не существует, то он будет создан.

Перенаправление стандартного вывода ошибок

Чтобы перенаправить стандартный вывод ошибок, нужно указать его дескриптор файла.

Важно

Программа может производить вывод в любой из нескольких нумерованных файловых потоков. Первые три из них мы упомянули как стандартный ввод, вывод и вывод ошибок. Командная оболочка ссылается на них как на файловые дескрипторы 0, 1 и 2 соответственно. Командная оболочка поддерживает синтаксис перенаправления файлов с использованием номеров файловых дескрипторов. Так как стандартному выводу ошибок соответствует файловый дескриптор 2, мы можем перенаправить его, как показано ниже:

$ ls -l /bin/usr 2> ls-error.txt

Перенаправление стандартного вывода и стандартного вывода ошибок в один файл

Есть два способа вывести два потока
* Традиционный
* Современный
В первом случае:

$ ls -l /bin/usr > ls-output.txt 2>&1

Здесь выполняется два перенаправления. Сначала стандартного вывода в файл ls-output.txt, затем с помощью 2>&1 — перенаправление файлового дескриптора 2 в файловый дескриптор 1.

В современном подходе используется один оператор &>

$ ls -l /bin/usr &> ls-output.txt

Удаление нежелательного вывода

Существует специальный файл /dev/null (bit bucket) — который создан, чтобы можно было в него перенаправлять сообщения, чтобы они нигде не выводились.
Например, чтобы подавить вывод сообщений об ошибках, достаточно:

$ ls -l /bin/usr 2> /dev/null

Перенаправление стандартного ввода

cat — объединение файлов

cat читает содержимое одного или нескольких файлов и копирует его в стандартный вывод

cat [file...]
$ cat ls-output.txt

Допустим нам нужно объеденить видосы

movi.mpeg.001 movie.mpeg.002 ... movie.mpeg.099
$ cat movie.mpeg.* > movie.mpeg

Если мы введем команду cat без аргументов, то она будет ждать ввода с клавиатуры. После того как введем текст, нужно обязательно нажать CTRL + D, сообщая, чтомы закончили ввод
Можно записать в файл следующим образом:

$ cat > eat_more.txt
Какой то текст

Затем нужно нажать CTRL + D. Чтобы прочитать текст с него можно либо указать файл в качестве аргумента, либо изменить источник данных для стандартного ввода с клавиатуры на файл

$ cat eat_more.txt
$ cat < eat_more.txt

Конвееры

С помощью оператора конвейера | (вертикальная черта) стандартный вывод одной команды (stdout) можно связать со стандартным вводом другой (stdin)

команда1 | команда2 

Например команда less может получать данные со стандартного ввода. Например, чтобы постранично отобразить вывод любой команды, которая посылает свои результаты в стандартный вывод:

$ ls -l /usr/bin | less

Фильтры

При объединении вместе нескольких команд, часто получаются так называемые фильтры. Они принимают ввод, изменяют его определенным образом и выводят результат. Например:
Нам необходимо составить список всех выполняемых программ в каталогах /bin и /usr/bin, расположив их по алфавиту, а затем вывести:

$ ls /bin /usr/bin | sort | less

Получили вместо двух сортированных списков единый сортированный список

uniq — поиск и удаление повторяющихся строк

Часто используется с командой sort, принимает сортированный список данных либо с stdin либо из файла, имя которого можно передать аргументом, удаляет повторяющиеся строки из списка.
Например:

$ ls /bin /usr/bin | sort | uniq | less

Если же нам наоборот нужно получить список дубликатов, то просто подставим к uniq параметр -d

ls /bin /usr/bin | sort | uniq -d | less

wc — вывод числа строк, слов и байтов

wc (word count — счетчик слов) используется для подсчета числа строк, слов и байтов в файлах, например

$ wc ls-output.txt

Если эту команду вывести без аргументов, то она будет принимать данные с stdin. С помощью аргументов, можно ограничить вывод только байтами, или числом слов и т.д.
Эту команду например удобно использовать для подсчёта числа элементов в сортированном списке:

$ ls /bin /usr/bin | sort | uniq | wc -l

grep — поиск строк, соответствующих шаблону

Шаблон команды

grep pattern [file...]

Когда grep находит совпадение с шаблоном, она выводит строку с найденным совпадением.
Допустим, нам надо вывести все файлы в списке программ, которые имеют в своем имени последовательность символов zip

ls /bin /usr/bin | sort | uniq | grep zip

Наиболее часто используемые параметры с grep это -i и -v. Первый игнорирует регистр символов, второй выводит только те строки, где совпадение не было найдено.

head/tail — вывод первых/последних строк из файлов

Выводят первые/последние 10 строк. Количество строк можно изменить с помощью параметра -n

$ head -n 5 ls-output.txt

Также можно использовать в конвеерах

$ ls /usr/bin | tail -n 5

Также можно наблюдать как изменяется содержимое файла в режиме реального времени. Например удобно следить за журналом логов. Например:

$ tail -f /var/log/messages

tee — чтение со стандартного ввода и запись в стандартный вывод и в файлы

Создает T-образное разветвление в конвейере. Она читает данные с stdin и копирует их в stdout (чтобы дать возможность передать их дальше по конвейеру) и в один или несколько файлов. Это может пригодиться, для сохранения промежуточных результатов обработки в конвейере. Например, сохраним полный список файлов в каталогах в файле ls.txt, перед тем как он будет отфильтрован командой grep:

$ ls /usr/bin | tee ls.txt | grep zip

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *