Linux-утилиты одной строкой на Perl? Я попробовал — и удивился результату!

Иллюстрация: логотип Perl на фоне терминала

Пока Python и другие языки только набирают обороты, Perl не сдает позиций, особенно когда речь о работе с текстом. Однострочники на Perl (one-liners) — это возможность быстро, прямо в командной строке, заменить привычные Unix-утилиты и решить кучу задач без написания длинных скриптов. Давайте покажу, как это делается и какие фишки можно выжать из пары символов кода.

Регулярные выражения вместо grep

grep уже давно стал классикой для поиска по тексту через регулярки. Но Perl настолько силён в этом, что многие приложения специально поддерживают его синтаксис. Сделать свой grep на Perl — проще простого:

Сначала разберёмся по шагам. Ключ -n говорит Perl сам обернуть ваш код в цикл по строкам файла:

-n сообщает интерпретатору Perl читать файл или ввод построчно. Оператор перебирает каждую строку, а вы пишете, что делать дальше. Всё, что заключено между //, — это ваш паттерн для поиска. За деталями советую заглянуть в официальную документацию на страницу perlrun.

Ключ -e позволяет прямо передать код, не создавая отдельный pl-файл. Благодаря этому и возможны мощные однострочные команды. Соберём свой grep на Perl и разберёмся, как он работает.

Например, хочу найти все запущенные shell-процессы — часто у них в имени встречается «sh». Для этого вывожу список процессов командой ps aux и передаю его нашему однострочнику через «|» (пайп):

Начнём с простого поиска строк, где встречается «sh»:

Поиск «sh» с помощью Perl one-liner по выводу ps

В результате видим все строки из вывода ps, где встречается «sh». Хотите усложнить поиск? Можно добавить условия или подобрать паттерн точнее — например, искать «s», за которым сразу идёт «h».

Проще простого искать любые комбинации с «sh» — так вы найдёте и «bash», и «zsh».

Рекомендую всю команду Perl заключать в одинарные кавычки — так bash не будет преждевременно обрабатывать спецсимволы вместо Perl. Иначе — получите ошибку.

Так как многие shell-программы заканчиваются на «sh», используйте класс символов «b» для поиска на границе слова:

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

Например, выведите все строки с «sh» из файла example.txt.

Чтобы сделать обратный поиск, как grep -v, просто используйте в Perl конструкцию unless:

Извлекаем столбцы вместо awk

awk многие используют для разбора таблиц или вывода процессов. Но Perl-однострочник с этим тоже справляется на ура.

Например, чтобы вывести имена пользователей и путь до исполняемого файла из ps aux, напишите так:

Выделение определённых столбцов из вывода ps через Perl one-liner

Суть: Perl сам перебирает строки, а для столбцов использует массив @F. Чтобы обратиться к нужному полю, пишите $F[номер] — отсчёт начинается с нуля. $F[0] — пользователь, $F[10] — путь к процессу (для Linux; на BSD индексы могут отличаться, проверьте по своей системе).

Фишка Perl: чтобы обращаться к переменным-массивам внутри однострочника, пишите их в двойных кавычках внутри одинарных.

Если у вас необычный разделитель — например, двоеточие, используйте ключ -F и задайте свой паттерн разделения.

Поиск и замена вместо sed

Поиск с заменой по шаблону («s/старое/новое/») знаком каждому, кто работал с sed или Vim. В Perl этот приём работает почти так же, и однострочник получается крайне лаконичным:

Работает одинаково хорошо и с пайпом, и с файлом на входе. Давайте заменим «dog» на «cat» для примера:

Perl one-liner заменяет «dog» на «cat»

Попробуйте на фразе «Мне нравится гладить свою собаку» — слово «dog» заменится на «cat».

Если строка содержит сразу несколько «dog» («My dog’s breath smells like dog food»), по умолчанию Perl подменит только первое совпадение.

Чтобы заменить все вхождения — добавьте флаг «g» (от англ. global):

Теперь кошачий корм — только для кошки:

Перл-однострочник глобально заменяет «dog» на «cat»

Теперь каждое «dog» меняется на «cat» в любой строке.

Сортировка вместо sort

Чтобы отсортировать список, обычно вызывают sort. На Perl всё делается одной строкой:

Однострочная сортировка списка Perl’ом

Эта команда отсортирует любые строки из файла или пайпа. Учтите: сортировка зависит от языковых настроек системы (locale). Например, на C.UTF-8 строки с заглавными буквами будут первыми.

Удаляем дубликаты вместо uniq

Частая задача — убрать дубликаты из списка, обычно через sort в паре с uniq. На Perl — тоже одной командой:

Perl-однострочник выводит только уникальные строки

Фокус в том, что Perl сравнивает текущую строку с предыдущей и выводит только неповторяющееся. Переменная $_ — это текущая строка. Честно, я всё равно чаще использую uniq (он быстрее набирается!), но знать о возможностях Perl всегда полезно.

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

Переводим символы вместо tr

Команда tr в Linux обычно нужна, чтобы заменить отдельные символы или целые группы. Например, перевести текст в ВЕРХНИЙ РЕГИСТР одной строкой — проще простого:

Перл-однострочник переводит текст в caps lock

Все буквы от a до z моментально станут заглавными.

И это только маленькая часть магии однострочников на Perl: практически любую задачу по обработке текста можно решить одной командой, вместо скучной пачки утилит. Perl по-прежнему жив, бодр и иногда может удивить даже опытного линуксоида!

Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!

Премиум подписка — это доступ к эксклюзивным материалам, чтение канала без рекламы, возможность предлагать темы для статей и даже заказывать индивидуальные обзоры/исследования по своим запросам!

Подробнее о том, какие преимущества вы получите с премиум подпиской, можно узнать здесь

Также подписывайтесь на нас в:

Алекс Бежбакин
Оцените автора
Добавить комментарий