Перенаправление потоков ввода-вывода
Перенаправление потоков
>
- перенаправить поток вывода в файл.>>
- добавлять данные в конец файла, а не перезаписывать<
- перенаправление потока ввода из файла.2>
- перенаправить поток ошибок в файл.&>
- перенаправить ВСЕ потоки вывода в файл.
Pipeline, pipe и т.д.
pipe - специальный механизм общения между несколькими процессами, который предоставляет 2 файловых дискриптора. В один можно писать информацию, а из другого её считывать.
Как использовать:
- Создать pipe в родительском процессе.
- Создать новый процесс.
- Использовать один из концов pipe в каждом процессе.
Важно, что pipe предоставляет именно файловые дискрипторы. В результате мы можем расширить предыдущий вариант на следующую схему:
- Создать pipe.
- Заменить стандартный поток вывода на вход pipe.
- Создать первый дочерний процесс.
- Заменить стандартный поток ввода на выход pipe.
- Создать второй дочерний процесс.
=> Результат работы первого процесса будет передан второму процессу.
Для реализации такой схемы в BASH используется оператор |
: command1 | command2
. В этом случае вывод команды 1 будет перенаправлен на станадртный вход команды 2.
А для чего это можно использовать?
Просмотр большого количества информации в программе-пейджере. ls /usr/bin | less
.
Сортировкой потока данных. sort
- сортировать поток входящих строк в лексикографическом порядке.
- Мы хотим посмотреть список всех исполняемых файлов, отсортированных по имени.
ls /bin /usr/bin | sort
- Мы хотим посмотреть на содержимое всех файлов в лексикографическом порядке. Например у меня есть файлы контрольных, а я хочу посмотреть результаты студента в целом.
cat data* | sort
. - А если результаты в обратном порядке, надо использовать аргумент
-r
.
Получить уникальные результаты. uniq
.
Приложение работает только в связке с sort
. А как можно узнать количество повторений? Для этого надо использовать аргумент -c
: cat data* | sort | uniq -c
Подсчитать количество строк. wc
.
- Для получения количества строк:
-l
- Для получения количества слов:
-w
Сделать фильтрацию по содержимому. grep
Grep может самостоятельно считывать содержимое файлов. Т.е. он не просто фильт по потокам данных, а более сложное приложение.
grep PATTERN [file ...]
В случае фильтрации потока не надо указывать файлы, достаточно просто указать фильтр.
Для описания фильтров используются регулярные выражения.
Найти все исполняемые файлы, в имени которых присутствует слово zip
. Отсортируйте результаты в обратном порядке.
ls /usr/bin /bin | grep zip | sort -r
Получить только лишь начало потока. head
.
Для получения конкретного количества символов надо использовать -n N
. N - количество строк, которое надо показать.
Получить только лишь окончание потока. tail
.
tail может следить за состоянием файла и печатать новые строки в нём. Для этих целей используем аргумент -f
.
Мы можем отводить поток в файл. tee
-T- - отведение потока. Tee копирует содержимое потока не только на stdout, но также и в файл. Оно удобно для тестирования и отладки поведенеия потоков данных между приложениями.
Вывод |
используется в основном для обработки и фильтрации потоков данных от пользователя.