Учебное пособие по Pipe в Bash

Linux pipe bash

Обычно мы получаем вывод любой команды в терминал. Иногда нам нужно отправить вывод команды как ввод другой команды. Эту задачу можно выполнить, выполнив команды последовательно или несколько раз. Поможет нам команда канала или конвейера, которая выполняет две или более команд одновременно в 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 станет понятно использование оператора канала (|).

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

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