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

uniq — убрать или посчитать повторы

4 мин Ubuntu 24.04 · GNU coreutils 9.4

Команда uniq схлопывает соседние одинаковые строки, а с -c считает их; перед ней почти всегда стоит sort.

Шпаргалка

6 команд Версия для печати
  • sort file | uniq убрать повторы
  • sort file | uniq -c сколько раз каждая строка
  • sort file | uniq -c | sort -rn частые сверху
  • sort file | uniq -d только те, что повторяются
  • sort file | uniq -u только те, что без пары
  • sort file | uniq -ci не различать регистр

Обзор

uniq сравнивает каждую строку с предыдущей. Одинаковые строки подряд превращаются в одну, с -c перед ней печатается их число. Строки, разделённые другими, для uniq разные:

text
student@ubuntu:~$ printf 'a\na\nb\na\n' | uniq -c
      2 a
      1 b
      1 a
student@ubuntu:~$ printf 'a\na\nb\na\n' | sort | uniq -c
      3 a
      1 b

Поэтому uniq почти всегда стоит после sort: сортировка собирает одинаковые строки рядом. Сам по себе uniq удобен там, где повторы и так идут подряд, — например, в журнале, где одна ошибка пишется много раз за секунду.

Число в uniq -c выровнено пробелами по правому краю. Для cut эти пробелы — пустые колонки, поэтому счётчик дальше разбирают через sort -rn или awk.

Ключи

7

sort -u даёт то же, что sort | uniq, но считать повторы умеет только uniq -c. Полный список — man uniq.

Ключ Что делает Пример
-c --count Печатать перед строкой, сколько раз она повторилась подряд. sort file | uniq -c
-d --repeated Печатать по одной строке только из тех, что повторяются. sort file | uniq -d
-u --unique Печатать только строки без повторов. sort file | uniq -u
-i --ignore-case Не различать заглавные и строчные буквы. sort -f file | uniq -ci
-D --all-repeated Печатать все копии повторяющихся строк. sort hosts.txt | uniq -D
-f --skip-fields N Не сравнивать первые N колонок. uniq -f1 -c events.log
-w --check-chars N Сравнивать только первые N символов строки. uniq -w8 -c ids.txt

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

Рецепты

4

Топ адресов в журнале веб-сервера

bash
cut -d' ' -f1 access.log | sort | uniq -c | sort -rn | head -5

Ответ на вопрос «кто чаще всего обращался»: адрес и число запросов, большие сверху.

Сколько разных значений

bash
cut -d: -f7 /etc/passwd | sort | uniq -c    # учёток на оболочку
cut -d: -f7 /etc/passwd | sort -u | wc -l   # сколько разных оболочек

Найти дубли в списке

bash
sort hosts.txt | uniq -d     # что записано дважды
sort hosts.txt | uniq -D     # все копии повторов

Сравнивать не всю строку

bash
uniq -f1 -c events.log    # пропустить первую колонку (время)
uniq -w8 -c ids.txt       # сравнивать только первые 8 знаков

-f N пропускает N колонок, разделённых пробелами, -w N сравнивает первые N символов.

Неполадки

4

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

Повторы стоят не подряд. Отсортируй перед uniq: sort file | uniq.

Строки выглядят одинаково, но не схлопываются

Различаются невидимые символы: пробел в конце или \r из файла Windows. Посмотри их через cat -A file — в конце строки будет ^M$ или пробел перед $. Убрать \r — tr -d '\r'.

cut не берёт число из вывода uniq -c

Перед числом стоят пробелы для выравнивания, и cut -d' ' видит пустые колонки. Бери число через awk '{print $1}' или сортируй по нему sort -rn.

uniq: x: No such file or directory

Файла нет по этому пути. Проверь имя через ls. Второе имя в uniq in.txt out.txt — это файл для записи, а не второй входной файл.

Опасно

1

Второй аргумент — файл вывода

uniq a.txt b.txt не сравнивает два файла: он читает a.txt и перезаписывает b.txt результатом. Сравнивать списки — comm или diff, см. утилиты текста и diff и patch.

См. также

  • sort — собрать одинаковые строки рядом перед uniq.
  • cut — вырезать колонку, повторы которой считаешь.
  • wc — сколько строк осталось.
  • head — оставить верх частотного списка.
  • redirection — как устроен конвейер |.
  • text-tools — comm, tr и другие звенья конвейера.
Загрузка…