Перенаправление потоков ввода-вывода
Перенаправление потоков
>- перенаправить поток вывода в файл.>>- добавлять данные в конец файла, а не перезаписывать<- перенаправление потока ввода из файла.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, но также и в файл. Оно удобно для тестирования и отладки поведенеия потоков данных между приложениями.
Вывод | используется в основном для обработки и фильтрации потоков данных от пользователя.