Использование конвейеров

Использование конвейеров #

Васильев Андрей Михайлович, 2024

Версии презентации


Использование механизма pipe #

Помимо соединения потоков ввода и вывода с файлами Bash (операционная система) позволяет соединять поток вывода одного процесса с потоком ввода другого процесса

Данный механизм называется pipe, конвеер

В Bash для связи потоков двух процессов используется оператор |:

КОМАНДА-1 | КОМАНДА-2

В результате будут запущены КОМАНДА-1 и КОМАНДА-2, причём стандартный вывод КОМАНДА-1 будет подключён ко входу в конвеер, а выход конвеера подключён к стандартному входу программы КОМАНДА-2

diagram


Проблема длинного вывода команд #

Результат выполнения команды может не поместиться на экран, вследствие чего пользователю приходится просматривать предыдущий вывод

  • Прокручивать экран наверх с помощью мыши
  • Использовать горячие клавиши (зависит от эмулятора терминала)
    • Ctrl + Page Up, Ctrl + Page Down
    • Shift + Page Up, Shift + Page Down

Использование пейджера #

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

Чтобы найти нужную информацию в потоке данных их можно передать less

ls -l /usr/bin | less

Приложения-фильтры #

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

Благодаря конвеерам эти приложения зачастую объединяются

КОМАНДА | ФИЛЬТР-1 | ФИЛЬТР-2 | ФИЛЬТР-3

Два потока вывода #

Фильтры ориентированы на работу со структурированными данными

  • Вывод ошибок в один поток нарушит обработку структурированного потока информации
  • Вывод ошибок в отдельный поток позволяет решить задачу и увидеть возможные проблемы

Приложение sort #

Приложение сортирует входящий поток строк

Рассмотрим текстовый файл data.txt:

euo
aoeu
zeou

Сортировка файла:

$ cat data.txt | sort
aoeu
euo
zeou

Приложение uniq #

Выбрасывает из входящего потока данных повторяющиеся строки. Зачастую используется вместе с sort

Исходный файл:

abc
abc
def
abc
def
def
def

Отброс с сортировкой:

> cat data.txt | sort | uniq
abc
def

Отброс без сортировки:

> cat data.txt | uniq
abc
def
abc
def

Подсчёт количества слов, wc #

Приложение wc предназначено для вычисления статистических харакретистик в файле или потоке данных:

  • Количество слов
  • Количество линий
  • Количество байт
  • Количество символов

Для поиска уникально названных исполняемых файлов из каталогов /bin и /usr/bin можно воспользоваться командой

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

Поиск строк grep #

$ grep --help
Использование: grep [ПАРАМЕТР]… ШАБЛОНЫ [ФАЙЛ]…
Поиск ШАБЛОНОВ в каждом ФАЙЛЕ.
Пример: grep -i 'hello world' menu.h main.c
  • Если grep находит строку, соответствующую шаблону, то он её выводит
  • Если grep не передать файлы для обработки, то он будет обрабатывать данные из стандартного потока ввода
  • Для описания шаблона используются регулярные выражения
> ls /bin /usr/bin | sort | uniq | grep zip
bunzip2
bzip2
bzip2recover
funzip
gpg-zip
gunzip

Начало и конец файла #

Отображение начала файла или потока, head #

Приложение head показывает первые строки файла или стандартного потока ввода

Для управления количеством показываемых линий используется аргумент -n

$ ls /usr/bin | head -n 4
[
411toppm
7z
7za

Отображение конца файла или потока, tail #

Приложение tail показывает последние строки файла или стандартного потока ввода

$ ls /usr/bin | tail -n 4
zipnote
zipsplit
zoom
zsh

Отслеживание изменений в файле #

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

Приложение tail позволяет следить за изменениями в файле

tail -f info.log

В одной консоли будем следить за состоянием файла:

$ touch work.log
$ tail -f work.log
abc
def
def
tail: work.log: файл усечён
info

В другой консоли будем изменять данный файл:

$ echo 'abc' > work.log
$ echo 'def' >> work.log
$ echo 'def' >> work.log
$ echo 'info' > work.log

Отведение потока в файл, tee #

Термином tee называется Т-образный отвод трубопровода

Приложение tee принимает данные на стандартный поток ввода, а затем записывает их на стандартный поток вывода и в файл на жёстком диске

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

$ ls /usr/bin | grep zip | tee -a zip-list | wc -l
21
$ cat zip-list
funzip
gpg-zip
lzip
...

Текстовый процессор awk #

AWK — это инструмент и скриптовый язык, предназначенный для работы с текстовыми документами

  • AWK работает над отдельными строками документа
  • AWK разбивает строки на поля
  • AWK может сопоставлять строки с шаблонами
  • AWK может выполнять действия над подходящими линиями
$ cat workers.txt
Василий менеджер 10000
Иван разработчик 5000
Ира аналитик 5500
Михаил разработчик 5100
Степан аналитик 5400
$ awk '{print $1,$3}' workers.txt
Василий 10000
Иван 5000
Ира 5500
Михаил 5100
Степан 5400

Текстовый редактор sed #

Данный текстовый редактор позволяет выполнять операции над отдельными строками в файле или в потоке данных

$ sed --help
Использование: sed [ПАРАМЕТР]… {только-сценарий-если-нет-другого-сценария} [входной-файл]…
...
$ cat info.txt
linux is great os. unix is opensource. unix is free os.
learn operating system.
linux linux which one you choose.
linux is easy to learn.unix is a multiuser os.Learn unix
$ cat info.txt | sed 's/unix/linux/2'
linux is great os. unix is opensource. linux is free os.
learn operating system.
linux linux which one you choose.
linux is easy to learn.unix is a multiuser os.Learn linux

Обработка JSON с помощью jq #

  • Множество приложений используют формат JSON для передачи данных
  • Если он отформатирован, то многие задачи можно решить базовыми фильтрами
  • Но он зачастую таким не является
  • Задачи структурной обработки выполнить невозможно

$ echo '{"fruit":{"name":"apple","color":"green","price":1.20}}' | jq '.'
{
  "fruit": {
    "name": "apple",
    "color": "green",
    "price": 1.2
  }
}

Структурированная обработка:

$ jq '.fruit.color' fruit.json
"green"

© A. M. Васильев, 2025, CC BY-SA 4.0, andrey@crafted.su