Извлечение определенных колонок или полей из текстового вывода команд является одной из наиболее частых задач в системном администрировании и DevOps. Традиционно для этого используются утилиты cut и awk.

Однако cut имеет ряд ограничений: он работает только с односимвольными разделителями и неэффективен при обработке данных, где поля разделены несколькими пробелами или другими сложными паттернами. awk, будучи мощным инструментом, часто избыточен для простых операций, таких как выбор второго поля, требуя при этом специфического синтаксиса (например, awk '{print $2}'). Более того, обработка полей, разделенных переменным количеством пробелов или сложными регулярными выражениями, может превратиться в трудоемкую задачу.

Представляем choose — современную консольную утилиту, написанную на Rust, которая служит эффективной заменой для cut и упрощает многие сценарии использования awk. choose интуитивно понятна, по умолчанию корректно обрабатывает пробелы в качестве разделителя, поддерживает отрицательные индексы (для выбора полей с конца), диапазоны и может использовать регулярные выражения в качестве разделителя, значительно упрощая парсинг сложных текстовых данных.

Установка choose

Установка choose проста и может быть выполнена несколькими способами в зависимости от вашей операционной системы или предпочтений.

Для Ubuntu/Debian (через cargo)

cargo install choose

Для Arch Linux

sudo pacman -S choose

Для macOS

brew install choose

Ручная установка бинарника с GitHub

wget https://github.com/theryangeary/choose/releases/latest/download/choose-x86_64-unknown-linux-gnu.zip
unzip choose-*.zip
sudo cp choose /usr/local/bin/

Базовое использование choose

choose значительно упрощает стандартные задачи по извлечению полей из текстового потока, заменяя собой рутинные операции cut и awk.

Извлечение второго поля (индексация с 0)

По умолчанию choose использует пробелы в качестве разделителя.

ls -l | choose 1

Извлечение нескольких полей или диапазона

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

echo "one two three four five" | choose 1 2 3

или используя синтаксис диапазона (поля с индексом 1 по 3 включительно):

echo "one two three four five" | choose 1:3

Извлечение последнего поля (отрицательный индекс)

choose поддерживает отрицательные индексы, что позволяет легко выбирать поля с конца строки. В этом примере используется разделитель двоеточие (-d ':').

echo "user:123:alice:/home/alice" | choose -1 -d ':'

Использование регулярного выражения в качестве разделителя

Для более сложных сценариев choose позволяет задавать разделитель в виде регулярного выражения.

echo "word1...word2...word3" | choose 1 -d '\.\.\.'

Расширенные возможности (Киллер-фичи)

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

1. Работа с несколькими разделителями

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

echo "2026-03-09 12:34:56 ERROR: что-то сломалось" | choose -f 2 -d ' ' -d ':'

В этом примере choose будет использовать как пробел, так и двоеточие в качестве разделителей, что позволяет легко извлечь ERROR.

2. Выбор полей с заданного индекса до конца строки

choose позволяет легко выбрать все поля, начиная с определенного индекса и до конца строки.

echo "a b c d e" | choose 2:

Результатом будет c d e, что соответствует полям с индексом 2 и далее.

3. Замена разделителя при выводе

Эта функция полезна для форматирования вывода, позволяя объединять выбранные поля с новым разделителем.

echo "a b c d" | choose 0 2 -o ','

Выбранные поля a и c будут выведены как a,c.

4. Удобная работа с CSV-файлами

Когда разделителем является запятая, choose легко справляется с CSV-данными.

cat data.csv | choose 2 4 -d ','

Заключение

choose представляет собой мощный и интуитивно понятный инструмент для эффективного извлечения данных из текстовых потоков в командной строке. Его гибкость в работе с разделителями, поддержка отрицательных индексов и диапазонов, а также возможность использования регулярных выражений значительно упрощают задачи, которые ранее требовали сложного синтаксиса awk или были недоступны для cut. Будь то быстрый поиск PID в выводе ps или извлечение IP-адреса из ip addr, choose делает процесс быстрым и бесшовным.

Ознакомиться с проектом более подробно можно на его GitHub-странице.

Использовали ли вы уже choose в своей работе? Или предпочитаете оставаться с классическими awk и cut даже для простых задач? Поделитесь своим опытом в комментариях!