
Обычно мы получаем вывод любой команды в терминал. Иногда нам нужно отправить вывод команды как ввод другой команды. Эту задачу можно выполнить, выполнив команды последовательно или несколько раз. Поможет нам команда канала или конвейера, которая выполняет две или более команд одновременно в Linux, где вывод одной команды является вводом для следующей команды в конвейере. Управляющий оператор Pipes «|» или «| &» передавая данные из вывода одного процесса (stdout) на вход другого (stdin) следующей команде в конвейере. Простым языком данные передаются только в одном направлении — от отправителя к получателю.
Использование команды pipe описано в этом небольшом руководсте.
Примеры команд канала
Различные варианты использования команды pipe (|) показаны в этой части статьи.
Пример 1: запись в файл
Конкретное строковое значение может быть записано в новый файл с помощью команд «echo» и «cat».
Выполните следующую команду, чтобы записать строковое значение в файл test.txt. Здесь вывод команды «echo» передается как ввод команды «cat»:
$ echo "Learn bash programming" | cat > test.txt
Выполните следующую команду, чтобы проверить содержимое файла test.txt :
$ cat test.txt
Следующий вывод показывает, что файл успешно создан с выводом команды «echo»:
user@vhost:-$ echo "Learn bash programming" | cat > test.txt user@vhost:~$ cat test.txt Learn bash programming user@vhost: -$
Пример 2. Подсчет общего количества конкретных файлов
В этом примере показан метод подсчета общего количества текстовых файлов, начинающихся со слова «test». Эту задачу можно выполнить с помощью нескольких команд или одной команды с вертикальной чертой (|).
Выполните следующую команду, чтобы распечатать список текстовых файлов текущего местоположения:
$ ls *.txt
Следующий вывод показывает, что есть два текстовых файла, которые начинаются со слова «test». Это test.txt и testfile.txt:
user@vhost:-$ ls *.txt error.txt file2.txt fruits.txt output.txt testfile.txt file.txt filter.txt items.txt students.txt file1.txt folderList.txt myfile.txt test.txt user@vhost: -$
Выполните следующую команду, чтобы сохранить список текстовых файлов в переменной $list:
$ list=`ls *.txt`
Выполните следующую команду, чтобы узнать список текстовых файлов, начинающихся со слова «test», и сохраните их в файле filter.txt:
$ grep test*.txt $list > filter.txt
Выполните следующую команду, чтобы подсчитать общее количество строк в файле filter.txt:
$ wc -l filter.txt
После выполнения предыдущих команд появляется следующий вывод:
user@vhost:-$ list='ls *.txt user@vhost:-$ grep test*.txt $list > filter.txt user@vhost:-$ wc -l filter.txt 2 filter.txt user@vhost: - $
Задачу предыдущих команд можно легко выполнить с помощью следующей одиночной команды, в которой вывод команды ls отправляется в качестве ввода команды grep. Вывод команды «grep» аналогичен вводу команды wc с использованием канала (|).
$ ls *.txt | grep test | wc -l
После выполнения предыдущей команды появляется следующий вывод:
user@vhost:-$ ls *.txt | grep test | wc -l 2 user@vhost: -$
Пример 3. Сортировка содержимого файла
Команду sort можно использовать для сортировки содержимого файла различными способами. В этой части руководства показан метод сортировки содержимого текстового файла с помощью команд «cat» и «sort».
Создайте текстовый файл с именем products.txt со следующим содержимым:
Mouse A4Tech 100 Monitor DELL 120 Keyboard Defender 200 Scanner Epson 230 Headphone Apple 111
Выполните следующую команду, чтобы проверить содержимое файла products.txt:
$ cat products.txt
После выполнения предыдущей команды появляется следующий вывод:
user@vhost:-/Desktop/bash$ cat products.txt Mouse A4Tech 100 Monitor DELL 120 KB MSI 200 Scanner Epson 230 IPOD Apple 111 user@vhost:-/Desktop/bash$
Выполните следующую команду, чтобы отсортировать содержимое файла в порядке возрастания на основе первого столбца файла:
$ cat products.txt | sort
После выполнения предыдущей команды появляется следующий вывод:
user@vhost:-/Desktop/bash$ cat products.txt | sort IPOD Apple 111 KB MSI 200 Monitor DELL 120 Mouse A4Tech 100 Scanner Epson 230 user@vhost:-/Desktop/bash$
Выполните следующую команду, чтобы отсортировать содержимое файла в порядке убывания на основе первого столбца файла:
$ cat products.txt | sort -r
После выполнения предыдущей команды появляется следующий вывод:
user@vhost:-/Desktop/bash$ cat products.txt | sort -r Scanner Epson 230 Mouse A4Tech 100 Monitor DELL 120 KB MSI 200 IPOD Apple 111 user@vhost:-/Desktop/bash$
Выполните следующую команду, чтобы отсортировать содержимое файла в порядке возрастания на основе третьего столбца файла:
$ cat products.txt | sort -k3
После выполнения предыдущей команды появляется следующий вывод:
user@vhost:-/Desktop/bash$ cat products.txt | sort -k3 Mouse A4Tech 100 IPOD Apple 111 Monitor DELL 120 KB MSI 200 Scanner Epson 230 user@vhost: -/Desktop/bash$
Выполните следующую команду, чтобы отсортировать содержимое файла в порядке возрастания на основе первого столбца файла и сохранить отсортированные выходные данные в файле sortedProduct.txt:
$ cat products.txt | sort | cat > sortedProduct.txt
Выполните следующую команду, чтобы проверить содержимое файла sortedProduct.txt:
$ cat sortedProduct.txt
После выполнения предыдущих команд появляется следующий вывод:
user@vhost:-/Desktop/bash$ cat products.txt | sort | cat > sortedProduct.txt user@vhost:-/Desktop/bash$ cat sortedProduct.txt IPOD Apple 111 KB MSI 200 Monitor DELL 120 Mouse A4Tech 100 Scanner Epson 230 user@vhost:-/Desktop/bash$
Пример 4. Чтение конкретного содержимого файла
Команда «head» используется для чтения определенного количества строк с начала файла. Команда «tail» используется для чтения определенного количества строк с конца файла. В этом примере показаны методы использования команд «cat» и «head», «cat» и «tail», а также команд «cat», «head» и «tail» с оператором вертикальной черты (|).
Выполните следующие команды, чтобы проверить содержимое файла products.txt и распечатать первые две строки файла products.txt:
$ cat products.txt $ cat products.txt | head -2
После выполнения предыдущих команд появляется следующий вывод:
user@vhost:-/Desktop/bash$ cat products.txt Mouse A4Tech 100 Monitor DELL 120 KB MSI 200 Scanner Epson 230 IPOD Apple 111 user@vhost:-/Desktop/bash$ cat products.txt | head -2 Mouse A4Tech 100 Monitor DELL 120 user@vhost: -/Desktop/bashş
Выполните следующие команды, чтобы проверить содержимое файла products.txt и распечатать последние три строки файла products.txt:
$ cat products.txt $ cat products.txt | tail -3
После выполнения предыдущих команд появляется следующий вывод:
user@vhost:-/Desktop/bash$ cat products.txt Mouse A4Tech 100 Monitor DELL 120 KB MSI 200 Scanner Epson 236 IPOD Apple 111 user@vhost:-/Desktop/bash$ cat products.txt | tail -3 KB MSI 200 Scanner Epson 230 IPOD Apple 111 user@vhost:-/Desktop/bashs
Выполните следующие команды, чтобы проверить содержимое файла products.txt и распечатать последнюю строку из первых трех строк файла products.txt:
$ cat products.txt $ cat products.txt | head -3 | tail -1
После выполнения предыдущих команд появляется следующий вывод:
user@vhost:-/Desktop/bash$ cat products.txt Mouse A4Tech 100 Monitor DELL 120 KB MSI 200 Scanner Epson 230 IPOD Apple 111 user@vhost:-/Desktop/bash$ cat products.txt | head -3 | tail - KB MSI 200 user@vhost: -/Desktop/bash$
Именованные каналы (Named Pipes / FIFO)
Также известный как FIFO (First In, First Out — первый вошёл, первый вышел). Постоянный канал связи представленный специальным файлов в файловой системе, позволяющий взаимодействовать несвязанным процессам.
Как и анонимные каналы, данные предаются только в одном направлении.
Сохраняются в файловой системе до явного удаления.
Создаются с помощью mkfifo или mknod.
Область действия: могут использоваться между различными сессиями или несвязанными процессами.
Создание именованного канала:
$ mkfifo my_pipe
Запись в канал:
$ echo "Hello, World!" > my_pipe &
Чтение из канала:
$ cat < my_pipe
Анонимные каналы подходят для простых, временных задач, таких как объединение команд.
Именованные каналы лучше использовать для более сложных рабочих процессов, требующих меж-процессорного взаимодействия между несвязанными процессами или сессиями.
Заключение
Оператор канала (|) — очень полезный оператор Bash, который используется для разных целей. Некоторые распространенные варианты использования этого оператора показаны в этом руководстве на различных примерах. Мы надеемся, что после прочтения этой статьи пользователям Bash станет понятно использование оператора канала (|).