September 30

8 продвинутых инструментов командной строки Linux

Подписывайтесь на телеграм-канал usr_bin, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.

Сила Moreutils

Многие часто начинают знакомство с командной строкой с базового пакета coreutils, который предоставляет базовые инструменты для работы с файлами, текстом и оболочками. Эти утилиты составляют основу любой Unix-подобной системы, выполняя всё: от копирования файлов (с помощьюcp)до работы с текстом (с помощью cat). По мере роста сложности и перехода в разряд опытных пользователей часто обнаруживается, что одного coreutils недостаточно для решения более сложных задач.

В этой статье рассмотрим восемь мощных инструментов от moreutils, которые помогут более эффективно использовать командную строку.

Обзор Moreutils

Moreutils— это пакет дополнительных инструментов командной строки, призванный заполнить пробелы, оставленные coreutils. Созданный Джоуи Хессом и расширенный сообществом GNU Linux в 2007 году, moreutils предлагает специализированные утилиты, которые могут повысить производительность и оптимизировать рабочий процесс.

Хотя такие инструменты, как grep, sed, и awkчасто используются для более сложной обработки текста, moreutils предоставляет набор уникальных команд, которые еще больше расширяют возможности командной строки.

Вот список всех команд в пакете, некоторые из них подробно рассмотрим в этой статье:

  • chronic: выполняет команду незаметно, выводя информацию только в случае сбоя. Это особенно полезно для заданий cron, когда вы хотите получать уведомления только в случае возникновения проблем.
  • combine: Объединяет строки из двух файлов с использованием булевых операций, таких как AND, OR и XOR, обеспечивая больший контроль над задачами слияния файлов.
  • errno: Позволяет искать имена и описания ошибок, помогая быстро понимать коды ошибок без необходимости обращения к документации.
  • ifdata: Извлекает информацию о сетевом интерфейсе, не требуя анализа выходных данных ifconfig, что упрощает управление сетью.
  • ifne: Запускает программу только в том случае, если стандартный ввод не пуст. Это полезно, когда нужно выполнять команду только при наличии данных.
  • isutf8: проверяет, имеет ли файл или стандартный ввод формат UTF-8, обеспечивая единообразие кодировки данных во всех ваших проектах.
  • lckdo: выполняет программу, устанавливая блокировку, не позволяя другим процессам одновременно выполнять ту же команду, что имеет решающее значение в многопроцессных средах.
  • mispipe: объединяет две команды вместе, возвращая код завершения
  • parallel: выполняет несколько команд одновременно, используя все преимущества многоядерных процессоров для ускорения таких операций, как пакетная обработка.
  • pee: подобен tee, но вместо записи в несколько файлов отправляет стандартный ввод нескольким командам одновременно, что позволяет обрабатывать ввод с помощью нескольких команд одновременно.
  • sponge: обрабатывает стандартный ввод перед записью его в файл, предотвращая проблемы с перезаписью файлов, которые все еще читаются, — распространенная проблема при объединении команд в цепочку.
  • ts: добавляет временную метку к каждой строке ввода, что особенно полезно для регистрации или мониторинга времени событий в режиме реального времени.
  • vidir: открывает каталог в текстовом редакторе, позволяя переименовывать файлы, как если бы это были строки в текстовом файле, что гораздо быстрее, чем переименовывать файлы по одному.
  • vipe: вставляет текстовый редактор в конвейер, позволяя вручную редактировать содержимое выходных данных команды перед передачей его следующей команде.
  • zrun: автоматически распаковывает аргументы команды, упрощая процесс работы со сжатыми файлами.

Основы командных операций

Прежде чем углубляться в изучение конкретных инструментов, полезно ознакомиться с основами работы с командной строкой. Понимание таких операторов, как символы вертикальной черты ( |), подстановка команд ( $()) и логические операторы ( &&, ||), необходимо для эффективного использования как coreutils, так и moreutils.

  1. Пайпы (|): позволяют использовать выходные данные одной команды в качестве входных данных для другой. Пример: ls -l | grep ".txt"
  2. Подстановка ($()): использует вывод команды в качестве аргумента для другой команды. Пример: echo "Today is $(date)"
  3. Логические операторы:
  • && (AND): вторая команда выполняется только в случае успешного выполнения первой.
  • || (ИЛИ): Вторая команда выполняется только в случае неудачи первой.

Пример:

mkdir new_directory && cd new_directory
grep "pattern" file.txt || echo "Pattern not found"

Разобравшись с этим, давайте рассмотрим наиболее полезные утилиты командной строки в пакете.

combine: объединение файлов с использованием булевой логики

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

Вот небольшой пример использования двух простых файлов журналов:

Содержание syslog_day1.txt:

Error: Disk quota exceeded
Warning: CPU temperature high
Info: System rebooted

Содержание syslog_day2.txt:

Error: Disk quota exceeded
Warning: CPU temperature high
Info: New user added

С использованиемcombine

  • Операция AND: поиск общих строк в обоих файлах.
combine ./syslog_day1.txt and ./syslog_day2.txt

Вывод:

Error: Disk quota exceeded
Warning: CPU temperature high
  • Операция OR: объединение всех строк из обоих файлов.
combine ./syslog_day1.txt or ./syslog_day2.txt

Вывод:

Error: Disk quota exceeded
Warning: CPU temperature high
Info: System rebooted
Info: New user added
  • Операция XOR: поиск строк, уникальных для каждого файла.
combine ./syslog_day1.txt xor ./syslog_day2.txt

Вывод:

Info: System rebooted
Info: New user added
  • Операция NOT (НЕ): поиск строк в первом файле, которых нет во втором.
combine ./syslog_day1.txt not ./syslog_day2.txt

Вывод:

Info: System rebooted

ifne: выполнение команды, если вывод не пустой

Команда ifne — простой, но мощный инструмент, который выполняет команду только в том случае, если стандартный вывод (stdout) не пуст. Это особенно полезно в скриптах, где требуется выполнять последующие действия в зависимости от того, выдала ли предыдущая команда какой-либо результат.

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

С использованием ifne

Для достижения этого можно объединить grep с ifne

grep "Error" syslog.txt | ifne gzip syslog.txt

Разберем подробнее:

  • grep "Error" syslog.txt: поиск строк «Error» в файле лога.
  • | ifne gzip syslog.txt: если обнаружены строки с «Error» (т.е. если вывод не пустой), gzip сжимает файл syslog.txt.

Если команда grep обнаруживает в логе запись «Error», файл лога сжимается. Если записей «Error» нет, файл остаётся без изменений, и сжатие не выполняется.

parallel: выполнение нескольких заданий одновременно

Команда parallel позволяет запускать несколько заданий одновременно, используя мощь всех ядер процессора. Это может ускорить выполнение задач, которые в противном случае выполнялись бы последовательно.

Пример: выполнение нагрузочных тестов с curl

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

Вот как можно это сделать:

seq 1 100 | parallel -j10 curl -s -o /dev/null http://example.com
  • seq 1 100: Генерирует последовательность чисел от 1 до 100, представляющую из себя 100 запросов.
  • | parallel -j10: выполняет следующую команду ( curlв данном случае) параллельно, при этом одновременно выполняются 10 заданий (-j10).
  • curl -s -o /dev/null http://example.com: отправляет запрос http://example.comи отменяет вывод ( -sдля бесшумного режима — -o /dev/nullотменяет вывод).

При таком выполнении curl, на сервер одновременно отправляется 10 запросов, что значительно ускоряет моделирование всех 100 запросов. Это особенно полезно для нагрузочного тестирования или любого сценария, где требуется параллельное выполнение множества однотипных операций.

pee: отправка ввода нескольким командам одновременно

Команда pee пакета moreutils похожа на tee, но вместо записи входных данных в несколько файлов она отправляет стандартный ввод нескольким командам одновременно. Это особенно полезно, когда мы хотим обрабатывать одни и те же входные данные разными способами одновременно.

В файлах лога, которые мы разбирали ранее, мы будем одновременно искать записи разных типов, например, «Error», «Warning» и «Info». Можно использовать pee для параллельного выполнения нескольких команд grep с одними и теми же входными данными.

cat syslog.txt | pee 'grep Error' 'grep Warning' 'grep Info'
  • cat syslog.txt: выводит содержимое syslog.txt.
  • | pee 'grep Error' 'grep Warning' 'grep Info': отправляет выходные данные трем командам grep одновременно, каждая из которых фильтрует записи «Error», «Warning» и «Info».

Такая конфигурация позволяет извлекать записи лога разных типов одновременно, а не запускать несколько команд одну за другой. Каждая команда grep обрабатывает один и тот же входной поток, но с разным фильтром.

sponge: замена содержимого файла до записи

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

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

Вот как sponge поможет избежать эту проблему:

sort unsorted.txt | sponge unsorted.txt
  • sort unsorted.txt: сортирует содержимое unsorted.txt.
  • | sponge unsorted.txt: полностью считывает отсортированный вывод перед его обратной записью в unsorted.txt, гарантируя, что операция безопасна и не повредит файл.

ts: добавление временных меток к каждой строке ввода

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

Если есть файл лога и вы хотите добавлять временные метки к каждой записи по мере ее создания, вы можете использовать ts:

tail -f /var/log/syslog | ts

Объяснение:

  • tail -f /var/log/syslog: постоянно выводит новые строки, добавляемые в файл syslog.
  • | ts: добавляет временную метку к каждой новой строке, показывающую точное время создания каждой записи журнала.

vidir: редактирование каталогов и файлов в буфере Vim

Команда vidir позволяет редактировать имена файлов в каталоге, как строки в текстовом файле. Это делает пакетное переименование файлов гораздо проще и быстрее, чем многократное использование mv.

В Neovim плагины, такие как `oil.nvim` или `mini.files`, предоставляют гораздо более расширенный функционал. Подробнее здесь .

Пример: пакетное переименование файлов

Предположим, у нас есть каталог, полный файлов, и вы хотите переименовать их все одновременно:

vidir .
  • vidir .: открывает имена файлов в текущем каталоге в текстовом редакторе по умолчанию.
  • Вы можете редактировать имена файлов прямо в текстовом редакторе. После сохранения и закрытия редактора изменения применяются, и файлы переименовываются соответствующим образом.

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

vipe: редактирование содержимого конвейера с помощью текстового редактора

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

Представьте, что мы фильтруем некоторые логи по определенным записям и хотим внести некоторые изменения вручную перед сохранением результатов:

grep "Error" syslog.txt | vipe | tee errors.txt
  • grep "Error" syslog.txt: Находит все строки, содержащие «Error» в syslog.txt.
  • | vipe: открывает вывод grep в текстовом редакторе, где вы можете вручную внести изменения.
  • | tee errors.txt: сохраняет окончательный отредактированный вывод, errors.txtа также отображает его.

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

На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал usr_bin, где будет еще больше полезной информации.