С чего начать Первые шаги трек · 15 ступеней
Linux Labs

sort, uniq, cut, wc, tr — обработка текстовых потоков

5 мин GNU coreutils

Маленькие утилиты для конвейера; uniq убирает только соседние повторы, поэтому перед ним почти всегда нужен sort.

Шпаргалка

6 команд Версия для печати
  • sort -u file сортировка + уникальные
  • sort file | uniq -c | sort -rn частота строк (топ)
  • cut -d: -f1 file колонка по разделителю
  • tr 'a-z' 'A-Z' < file регистр
  • column -t -s, file.csv выровнять в таблицу
  • comm -12 <(sort a) <(sort b) пересечение двух файлов

Обзор

Маленькие утилиты, которые в конвейере (|) решают почти любую задачу обработки текста. Часто в связке с grep и sed/awk.

Ключи

10

sort без -n сравнивает строки как текст: 10 встанет раньше 9, потому что символ «1» меньше «9» — для чисел нужен -n. uniq схлопывает только подряд идущие одинаковые строки, поэтому почти всегда нужен предварительный sort. cut по умолчанию разделяет поля табуляцией — для CSV или passwd разделитель задаётся явно через -d.

Ключ Что делает Пример
-n sort — сравнивать значения как числа, а не как текст. sort -n sizes.txt
-c uniq — посчитать, сколько раз встретилась каждая строка. sort file | uniq -c
-d cut — задать разделитель полей вместо табуляции по умолчанию. cut -d: -f1 /etc/passwd
-f N cut — выбрать поля по номеру, можно несколько через запятую. cut -d: -f1,3 /etc/passwd
-l wc — посчитать строки. wc -l file
-d tr — удалить символы указанного набора вместо замены. tr -d ' \t' < file
-r sort — обратный порядок сортировки. sort -rn sizes.txt
-k N sort — сортировать по указанному полю, а не по всей строке. sort -k2 table.txt
-u sort — сразу убрать дубликаты после сортировки. sort -u file
-d uniq — показать только повторяющиеся строки. sort file | uniq -d

Ничего не найдено. Попробуй запрос короче.

Рецепты

3

sort / uniq

bash
sort file                         # отсортировать строки (лексикографически)
sort -n file                      # как числа
sort -rn file                     # по убыванию (числа)
sort -h file                      # человеко-размеры (2K, 1G)
sort -k2 file                     # по 2-му полю
sort -t: -k3 -n /etc/passwd       # разделитель «:», по 3-му полю, числами
sort -u file                      # отсортировать + убрать дубли
sort -c file                      # проверить, отсортирован ли

uniq file                         # убрать ПОДРЯД идущие дубли (нужен sort!)
sort file | uniq -c               # посчитать повторы каждой строки
sort file | uniq -c | sort -rn    # топ по частоте
sort file | uniq -d               # только повторяющиеся ; -u — только уникальные

cut / tr / wc / прочее

bash
cut -d: -f1 /etc/passwd           # 1-е поле, разделитель «:»
cut -d: -f1,3 /etc/passwd         # несколько полей
cut -c1-10 file                   # символы 1–10
tr 'a-z' 'A-Z' < file             # в верхний регистр
tr -d ' \t' < file                # удалить пробелы/табы
tr -s ' ' < file                  # схлопнуть повторяющиеся пробелы
tr -cd '[:print:]\n' < file       # выкинуть непечатаемые
wc -l file ; wc -w file ; wc -c   # строк / слов / байт
paste -d, a.txt b.txt             # склеить файлы по столбцам
join -t, -1 1 -2 1 a.csv b.csv    # реляционный join по ключу (оба отсортированы)
column -t -s, data.csv            # выровнять в таблицу
comm -12 <(sort a) <(sort b)      # строки, общие для двух файлов

Разбор логов и таблиц

bash
# топ-10 IP в access.log
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head

# уникальные значения колонки CSV
cut -d, -f3 data.csv | sort -u

# самые частые слова
tr -cs '[:alpha:]' '\n' < text | tr 'A-Z' 'a-z' | sort | uniq -c | sort -rn | head

# разница двух списков (что есть в A, но нет в B)
comm -23 <(sort A) <(sort B)

# красиво показать /etc/passwd как таблицу
column -t -s: /etc/passwd

Неполадки

5

sort сортирует числа не по величине

По умолчанию сортировка лексикографическая: 10 идёт раньше 9. Числовая — ключом -n, по нужной колонке — -k:

bash
sort -n sizes.txt          # по числам
sort -k2 -nr table.txt     # по второй колонке, по убыванию

uniq не убрал повторы

uniq схлопывает только соседние одинаковые строки, поэтому перед ним нужен sort: sort file | uniq -c.

cut не видит колонки

Разделитель по умолчанию — табуляция. Для пробелов и запятых его задают явно (cut -d, -f3), а для нескольких пробелов подряд надёжнее awk '{print $3}'.

wc -l показывает на одну строку меньше

Последняя строка файла без перевода строки не считается. Это нормально для вывода некоторых программ, проверить можно tail -c1 file | xxd.

Кириллица ломается в tr

tr работает с байтами, а не с символами: диапазоны вроде а-я в UTF-8 дадут мусор. Для многобайтовых текстов используй sed — см. sed-awk.

См. также

  • sort — сортировка строк: как текст, как числа, по колонке.
  • uniq — убрать или посчитать соседние повторы.
  • cut — вырезать колонки по разделителю.
  • wc — посчитать строки, слова и байты.
  • redirection — конвейер | и перенаправление вывода.
  • grep — Поиск строк по шаблону; регулярки, рекурсия, контекст.
  • sed-awk — Потоковое редактирование (sed) и обработка по столбцам (awk).
  • files-basics — Навигация и файлы — ls, cd, cp, mv, rm, cat, less, head, tail, копипаст в терминале.
Загрузка…