Gymterview
junior

Как работают команды sort, uniq, wc, cut и tr?

Эти пять утилит — «строительные кирпичики» текстовых конвейеров в Unix. Каждая делает одну операцию, а вместе через пайпы они решают сложные задачи обработки данных.

sort — сортировка

Пример
sort file.txt                    # Лексикографическая сортировка
sort -n file.txt                 # Числовая сортировка
sort -r file.txt                 # Обратная сортировка
sort -k2 file.txt                # Сортировать по второму полю
sort -k2 -n file.txt             # Числовая сортировка по второму полю
sort -t',' -k3 -n data.csv       # Разделитель — запятая, сортировка по 3-му полю
sort -u file.txt                 # Сортировка + удаление дубликатов
sort -h sizes.txt                # Сортировка human-readable размеров (10K, 2M, 1G)

uniq — работа с дубликатами

Важно: uniq удаляет только смежные дубликаты, поэтому данные должны быть предварительно отсортированы.

Пример
sort file.txt | uniq             # Удалить дубликаты
sort file.txt | uniq -c          # Подсчитать количество каждого дубликата
sort file.txt | uniq -d          # Показать только дублирующиеся строки
sort file.txt | uniq -u          # Показать только уникальные (не повторяющиеся) строки
sort file.txt | uniq -ci         # Подсчёт без учёта регистра

wc — подсчёт (word count)

Пример
wc file.txt                      # Строки, слова, байты
wc -l file.txt                   # Только количество строк
wc -w file.txt                   # Только количество слов
wc -c file.txt                   # Количество байт
wc -m file.txt                   # Количество символов (учитывает UTF-8)
wc -l *.java                     # Количество строк в каждом файле + итог

cut — извлечение полей или символов

Пример
cut -d',' -f1,3 data.csv         # Поля 1 и 3 (разделитель — запятая)
cut -d':' -f1 /etc/passwd        # Первое поле из /etc/passwd
cut -c1-10 file.txt              # Первые 10 символов каждой строки
cut -d' ' -f2- file.txt          # Со 2-го поля до конца

tr — замена и удаление символов (translate)

Пример
echo "HELLO" | tr 'A-Z' 'a-z'           # В нижний регистр
echo "hello" | tr 'a-z' 'A-Z'           # В верхний регистр
echo "hello   world" | tr -s ' '        # Сжать повторяющиеся пробелы (-s = squeeze)
echo "hello123" | tr -d '0-9'           # Удалить цифры (-d = delete)
echo "a:b:c" | tr ':' '\n'              # Заменить : на перенос строки
cat file.txt | tr -d '\r'               # Удалить возврат каретки (Windows -> Unix)

Комплексный пример — анализ лога

Пример
# Топ-10 IP по количеству запросов
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10

# Подсчитать количество строк кода в Java-проекте (без пустых строк)
find src -name "*.java" -exec cat {} + | grep -v '^\s*$' | wc -l

На собеседовании: интервьюер проверяет понимание того, что uniq требует предварительной сортировки (иначе дубликаты на разных позициях не удалятся). Частая ошибка — использовать uniq без sort и удивляться, что дубликаты остаются.