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.
- Пайпы (|): позволяют использовать выходные данные одной команды в качестве входных данных для другой. Пример:
ls -l | grep ".txt"
- Подстановка ($()): использует вывод команды в качестве аргумента для другой команды. Пример:
echo "Today is $(date)"
- Логические операторы:
- && (AND): вторая команда выполняется только в случае успешного выполнения первой.
- || (ИЛИ): Вторая команда выполняется только в случае неудачи первой.
mkdir new_directory && cd new_directory grep "pattern" file.txt || echo "Pattern not found"
Разобравшись с этим, давайте рассмотрим наиболее полезные утилиты командной строки в пакете.
combine
: объединение файлов с использованием булевой логики
Команда combine
пакета moreutils позволяет объединять строки из двух файлов с помощью булевых операций. Это особенно полезно, когда нужно сравнить или объединить данные из разных источников.
Вот небольшой пример использования двух простых файлов журналов:
Error: Disk quota exceeded Warning: CPU temperature high Info: System rebooted
Error: Disk quota exceeded Warning: CPU temperature high Info: New user added
С использованиемcombine
combine ./syslog_day1.txt and ./syslog_day2.txt
Error: Disk quota exceeded Warning: CPU temperature high
combine ./syslog_day1.txt or ./syslog_day2.txt
Error: Disk quota exceeded Warning: CPU temperature high Info: System rebooted Info: New user added
combine ./syslog_day1.txt xor ./syslog_day2.txt
Info: System rebooted Info: New user added
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, где будет еще больше полезной информации.