Найти тему

Linux. Конвееры, фильтры и еще немного про ввод-вывод.

В этой статье раскроем еще немного возможностей командной строки.

Начнем с конвееров. В командной строке Linux есть прекрасная возможность связать стандартный вывод одной команды со стандартным вводом другой. Это делается с помощью оператора | (вертикальная черта). Синтаксис следующий

команда1 | команда2 | ...

Для чего это надо, рассмотрим один пример:

$ls -l /bin | less

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

Пойдем дальше, допустим нам мало просто передать вывод ls в less, а мы еще хотим, чтобы вывод был отсортирован по алфавиту. Тут нам приходят на помощь фильтры. Например, фильтр sort сортирует вывод по алфавиту. Дополним наш конвеер

$ ls -l /bin | sort | less

Следующим шагом, дополним еще один аргумент в ls, директорией /usr/bin/. Допустим, мы хотим увидеть бинарники в обоих директориях. Но мы не хотим, чтобы на экран выводились значение, которые есть в обоих каталогах. Для этого используем фильтр uniq.

$ ls -l /bin /usr/bin | sort | uniq | less

А если мы, наоборот, хотим посмотреть дубликаты, то добавляем -d к uniq

$ ls -l /bin /usr/bin | sort | uniq -d | less

Теперь давайте посчитаем общее количество строк в таком выводе. Для этого используется команда wc с параметром -l. Обычный вызов считает, кроме строк, еще слова и байты.

$ls -la /usr/bin | wc -l
643

Еще есть супермощная команда grep, которая помогает организовать поиск по шаблону. Возможностей ее очень много, но рассматривать здесь их все не будем. Только поиск полного совпадения. Например, найдем все файлы, содержащие systemd в папке /usr/bin

$ls -la /usr/bin | sort | grep systemd
-rwxr-xr-x 1 root root 4411 Dec 14 2020 deb-systemd-invoke
-rwxr-xr-x 1 root root 14552 Mar 20 22:55 systemd-detect-virt
-rwxr-xr-x 1 root root 14560 Mar 20 22:55 systemd-cat
-rwxr-xr-x 1 root root 14672 Mar 20 22:55 systemd-ask-password
...

А что, если нам кроме вывода на экран, надо еще и сохранить вывод в какой-нибудь файл. Здесь пригодиться команда tee. При том сделать в конвеере можно в любой момент времени. Например, мы сначала сохранить вывод команды ls в файл ls.txt, а потом передать этот вывод в grep и вывести на экран.

$ls -la /usr/bin | tee ls.txt | grep systemd

В результате вывод будет и на экране, и будет создан файл ls.txt.

В дополнении, хотел бы рассказать еще про пару команд, это head и tail. Эти команды выводят первые и последние 10 строк из файла соответственно. Это бывает очень удобно при просмотре логов, когда не нужен вывод большого количества строк, а достаточно знать что произошло в конце или что было сначала.

Команда tail, еще обладает прекрасной возможностью отслеживать добавление строк в реальном времени. Для этого ее надо запустить с ключом -f.

Заключение.

В этой статье мы познакомились с такими крутыми штуками как конвейеры. Теперь, я думаю, у вас сложилось хорошее впечатление о Linux. О том, что эту ОС отличает ее похожесть на конструктор, что можешь собирать все под себя и под свои нужды. Не многие могут таким похвастаться.

В будущем, продолжим знакомиться с полезными инструментами и программами в работе системного администратора.

А пока подписывайтесь на мой канал. И про телеграмм тоже не забываем.