Команда uniq Linux
Команда uniq предназначена для поиска одинаковых строк в массивах текста. При этом с найденными совпадениями пользователь может совершать множество действий — например, удалять их из вывода либо наоборот, выводить только их.
Работа команды осуществляется как с текстовыми файлами (в том числе, записями скриптов), так и с текстом, напечатанным в командной строке терминала.
Синтаксис uniq
Запись команды осуществляется следующим образом:
$ uniq опции файл_источник файл_для_записи
Файл источник указывает откуда надо читать данные, а файл для записи — куда писать результат. Но их указывать не обязательно. В примерах мы будем набирать текст, который нуждается в редактировании, прямо в командную строку терминала, воспользовавшись ещё одной командой — echo, и применив к ней опцию -e. Это будет выглядеть так:
echo -e [текст, слова в котором разделены управляющей последовательностью\\n] | uniq
Эта управляющая последовательность нужна, чтобы указать утилите, что каждое слово выводится в новой строке. Если указано только название файла источника, результат выполнения команды появится прямо в окне терминала. А при наличии выходного файла текст будет напечатан в теле документа.
Опции uniq
У команды uniq есть такие основные опции:
- -u (—unique) — выводит исключительно те строки, у которых нет повторов.
- -d (—repeated) — если какая-либо строка повторяется несколько раз, она будет выведена лишь единожды.
- -D — выводит только повторяющиеся строки.
- —all-repeated[=МЕТОД] — то же самое, что и -D, но при использовании этой опции между группами из одинаковых строк при выводе будет отображаться пустая строка. [=МЕТОД] может иметь одно из трех значений — none (применяется по умолчанию), separate или prepend.
- —group[=МЕТОД] — выводит весь текст, при этом разделяя группы строк пустой строкой. [=МЕТОД] имеет значения separate (по умолчанию), prepend, append и both, среди которых нужно выбрать одно.
Вместе с основными опциями могут применяться дополнительные. Они нужны для более тонких настроек работы команды:
- -f (—skip-fields=N) — будет проведено сравнение полей, начиная с номера, который следует после указанного вместо буквы N. Поля — это слова, хотя, называть их словами в прямом смысле слова нельзя, ведь словом команда считает любую последовательность символов, отделенную от других последовательностей пробелом либо табуляцией.
- -i (—ignore-case) — при сравнении не будет иметь значение регистр, в котором напечатаны символы (строчные и заглавные буквы).
- -s (—skip-chars=N) — работает по аналогии с -f, однако, игнорирует определенное количество символов, а не строк.
- -c (—count) — в начале каждой строки выводит число, которое обозначает количество повторов.
- -z (—zero-terminated) — вместо символа новой строки при выводе будет использован разделитель строк NULL.
- -w (—check-chars=N) — указание на то, что нужно сравнивать только первые N символов в строках.
Примеры использования uniq
Прежде всего следует отметить главную особенность команды uniq — она сравнивает только строки, которые находятся рядом. То есть, если две строки, состоящие из одинакового набора символов, идут подряд, то они будут обнаружены, а если между ними расположена строка с отличающимся набором символов — то не будут поэтому перед сравнением желательно отсортировать строки с помощью sort. Без задействования файлов uniq работает так:
echo -e небо\\nоблака\\nоблака\\nоблака\\nсолнце\\nзвезды | uniq
После команды uniq можно использовать её опции. Вот пример вывода, где не просто удалены повторы, но и указано количество одинаковых строк:
echo -e небо\\nоблака\\nоблака\\nоблака\\nсолнце\\nзвезды | uniq -c

Теперь применим команду к тексту, который находится в файле.
uniq —all-repeated=prepend text-example.txt

Как можно заметить, глядя на снимок экрана, команда вывела в качестве повторяющихся только вторую и третью группу строк.

Причина этого — незаметный глазу символ пробела, который стоит в конце одной из строк первой группы. Нужно быть предельно внимательным при использовании uniq, чтобы получить качественный результат.
Используемая опция —all-repeated=prepend выполнила свою работу — добавила пустые строки в начало, в конец и между группами строк. Теперь попробуем сравнить только первые 5 символов в каждой строке.
echo -e небо исполосовано молниями\\nоблака на небе\\nоблака разогнал ветер\\nоблака закрыли солнце\\nсолнце светит ярко\\nзвезды кажутся огромными | uniq -w5

Как видно на скриншоте, повторяющиеся строки, которые начинались словом «облака», были удалены. Осталась только первая из них. Вывод только уникальных строк с использованием опции -u выглядит так:
echo -e небо\\nоблака\\nоблака\\nоблака\\nсолнце\\nзвезды | uniq -u

Чтобы проигнорировать определенное количество символов в начале одинаковых строк, воспользуемся опцией —skip-chars. В данном случае команда пропустит слово «облака», сравнив слова «перистые» и «белые».
echo -e небо\\nоблака перистые\\nоблака перистые\\nоблака белые\\nсолнце\\nзвезды | uniq —skip-chars=6

А вот наглядная демонстрация отличий при использовании опции —group с разными значениями. both добавило пустые строки как перед текстом, так и после него, а также между группами строк.
echo -e небо\\nоблака\\nоблака\\nоблака\\nсолнце\\nзвезды | uniq —group=both

Тогда как append не добавило пустую строку перед текстом:
echo -e небо\\nоблака\\nоблака\\nоблака\\nсолнце\\nзвезды | uniq —group=append

Выводы
Команда uniq linux пригодится тем, кто часто и много работает с массивами текста, не имея возможности вычитывать их самостоятельно. Следует заметить, что не все версии uniq работают исправно, поэтому иногда результат выдачи может отличаться от ожидаемого.
Свои вопросы относительно использования команды, а также замечания и пожелания оставляйте в комментариях.
Find unique lines
![]()
awk ‘!seen[$0]++’ is an abbreviation for awk ‘!seen[$0]++
this sort data and filter by unique values
uniq -u has been driving me crazy because it did not work.
So instead of that, if you have python (most Linux distros and servers already have it):
Assuming you have the data file in notUnique.txt
Note that due to empty lines, the final set may contain » or only-space strings. You can remove that later. Or just get away with copying from the terminal 😉
Just FYI, From the uniq Man page:
«Note: ‘uniq’ does not detect repeated lines unless they are adjacent. You may want to sort the input first, or use ‘sort -u’ without ‘uniq’. Also, comparisons honor the rules specified by ‘LC_COLLATE’.»
Как использовать команду uniq в Linux
Команда Linux uniq просматривает ваши текстовые файлы в поисках уникальных или повторяющихся строк. В этом руководстве мы расскажем о ее универсальности и функциях, а также о том, как вы можете максимально использовать эту замечательную утилиту.
Поиск совпадающих строк текста в Linux
Команда uniq быстро, гибко и отлично умеет. Однако, как и многие команды Linux, у него есть несколько причуд, и это нормально, если вы о них знаете. Если вы сделаете решительный шаг, не обладая знаниями изнутри, вы вполне можете остаться ломать голову над результатами. Мы будем указывать на эти причуды по ходу дела.
Команда uniq идеальна для тех, кто находится в лагере целеустремленных, спроектированных так, чтобы делать одно дело и делать это хорошо. Вот почему он также особенно хорошо подходит для работы с конвейерами и играет свою роль в конвейерах команд. Один из его наиболее частые соавторы это sort, потому что uniq должен иметь отсортированный ввод для работы.
Запуск uniq без параметров
У нас есть текстовый файл со словами к Роберт Джонсон песня Я верю, что вытираю свою метлу. Посмотрим, что из этого делает uniq.
Мы введем следующее, чтобы преобразовать вывод в less:

Мы получаем всю песню, включая повторяющиеся строки, меньше:

Это не похоже ни на уникальные, ни на повторяющиеся строки.
Верно — потому что это первая причуда. Если вы запустите uniq без параметров, он будет вести себя так, как если бы вы использовали параметр -u (уникальные строки). Это указывает uniq на печать только уникальных строк из файла. Причина, по которой вы видите повторяющиеся строки, заключается в том, что для того, чтобы uniq считал строку дубликатом, она должна быть смежной с ее дубликатом, и именно здесь применяется сортировка.
Когда мы сортируем файл, он группирует повторяющиеся строки, и uniq рассматривает их как дубликаты. Мы будем использовать sort для файла, направить отсортированный вывод в uniq, а затем направить окончательный вывод в less.
Для этого мы набираем следующее:

Отсортированный список строк отображается меньше.

Строка «Я думаю, что вытираю пыль со своей метлы» определенно встречается в песне не раз. Фактически, это повторяется дважды в первых четырех строках песни.
Итак, почему он отображается в списке уникальных строк? Поскольку в первый раз в файле появляется строка, она уникальна; дублируются только последующие записи. Вы можете думать об этом как о перечислении первого появления каждой уникальной строки.
Давайте снова воспользуемся сортировкой и перенаправим вывод в новый файл. Таким образом, нам не нужно использовать сортировку в каждой команде.
Набираем следующую команду:
sorted.txt »в окне терминала. ‘ width = ”646 ″ height =” 57 ″ onload = ”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);» onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”>
Теперь у нас есть предварительно отсортированный файл для работы.
Подсчет дубликатов
Вы можете использовать опцию -c (count), чтобы напечатать, сколько раз каждая строка появляется в файле.
Введите следующую команду:

Каждая строка начинается с того, сколько раз эта строка появляется в файле. Однако вы заметите, что первая строка пуста. Это говорит о том, что в файле пять пустых строк.

Если вы хотите, чтобы вывод был отсортирован в числовом порядке, вы можете передать вывод uniq в sort. В нашем примере мы будем использовать параметры -r (обратный) и -n (числовая сортировка) и направить результаты в less.

Список отсортирован по убыванию в зависимости от частоты появления каждой строки.

Список только повторяющихся строк
Если вы хотите видеть только те строки, которые повторяются в файле, вы можете использовать параметр -d (повторение). Независимо от того, сколько раз строка дублируется в файле, она указывается только один раз.
Чтобы использовать эту опцию, мы вводим следующее:

Дублированные строки перечислены для нас. Вы заметите пустую строку вверху, что означает, что файл содержит повторяющиеся пустые строки — это не пространство, оставленное uniq для косметического смещения списка.

Мы также можем комбинировать параметры -d (повторение) и -c (количество) и направлять вывод через сортировку. Это дает нам отсортированный список строк, которые появляются как минимум дважды.
Введите следующее, чтобы использовать эту опцию:

Список всех повторяющихся строк
Если вы хотите видеть список каждой повторяющейся строки, а также запись для каждого раза, когда строка появляется в файле, вы можете использовать параметр -D (все повторяющиеся строки).
Чтобы использовать эту опцию, вы вводите следующее:

Список содержит запись для каждой повторяющейся строки.

Если вы используете параметр –group, он печатает каждую повторяющуюся строку с пустой строкой либо до (добавление), либо после каждой группы (добавление), либо и до, и после (обе) каждой группы.
Мы используем append в качестве модификатора, поэтому набираем следующее:

Группы разделены пустыми строками, чтобы их было легче читать.

Проверка определенного количества символов
По умолчанию uniq проверяет всю длину каждой строки. Однако, если вы хотите ограничить проверки определенным количеством символов, вы можете использовать параметр -w (проверять символы).
В этом примере мы повторим последнюю команду, но ограничим сравнения первыми тремя символами. Для этого набираем следующую команду:

Мы получаем совершенно разные результаты и группировки.

Все строки, начинающиеся с «I b», сгруппированы вместе, потому что эти части строк идентичны, поэтому они считаются дубликатами.
Точно так же все строки, начинающиеся с «Я», обрабатываются как дубликаты, даже если остальной текст отличается.
Игнорирование определенного количества символов
В некоторых случаях может быть полезно пропустить определенное количество символов в начале каждой строки, например, когда строки в файле нумеруются. Или, скажем, вам нужно uniq, чтобы перепрыгнуть через метку времени и начать проверку строк с шестого символа, а не с первого символа.
Ниже представлена версия нашего отсортированного файла с пронумерованными строками.

Если мы хотим, чтобы uniq начинал свои проверки сравнения с третьего символа, мы можем использовать параметр -s (пропустить символы), набрав следующее:

Линии распознаются как дубликаты и подсчитываются правильно. Обратите внимание, что номера отображаемых строк соответствуют первому появлению каждого дубликата.
Вы также можете пропускать поля (последовательность символов и некоторое количество пробелов) вместо символов. Мы будем использовать параметр -f (поля), чтобы указать uniq, какие поля игнорировать.
Мы вводим следующее, чтобы указать uniq игнорировать первое поле:

Мы получили те же результаты, что и когда сказали uniq пропустить три символа в начале каждой строки.
Игнорирование дела
По умолчанию uniq чувствителен к регистру. Если одна и та же буква отображается в верхнем регистре и в нижнем регистре, uniq считает, что строки разные.
Например, посмотрите вывод следующей команды:

Строки «Я верю, что вытираю пыль со своей метлы» и «Я считаю, что вытираю пыль со своей метлы» не рассматриваются как дубликаты из-за разницы в регистре букв «B» в «верю».
Если мы включим параметр -i (игнорировать регистр), эти строки будут рассматриваться как дубликаты. Набираем следующее:

Теперь строки обрабатываются как дубликаты и сгруппированы вместе.
Linux предоставляет в ваше распоряжение множество специальных утилит. Как и многие из них, uniq — не инструмент, которым вы будете пользоваться каждый день.
Вот почему большая часть опыта работы с Linux заключается в том, чтобы помнить, какой инструмент решит вашу текущую проблему и где вы можете снова его найти. Однако, если вы будете практиковаться, у вас все будет хорошо.
Linux uniq command Quick Note
Introduce how to use uniq command remove duplicate、find the repeated、find the unique
Recently, my boss assigned me to analysis the sever log, i had to record the unique bokerid、repeated brokerid and remove duplicate brokerid compare to two files.
So have a quick note and share with everybody
Remove the duplicate lines=> uniq
we could use uniq to remove the duplicate line but the line has to be sorted.
Let’s say we have a file named brokerid.txt, which contains the following text:
If the file is not sorted, the result will only remove one of the continue duplicate line
⌨ ️uniq broker.txt (wrong)
⌨ sort broker.txt | uniq (sort the file so all the line will be in sequence)
only show repeated lines=> uniq -d
Show lines that occur more than once and write the result to standard output.
broker.txt has repeated 1240 in file.
⌨ uniq -d broker.txt
show line that are not repeated(show the unique one)=> uniq -u
We will use uniq -u , but we have to notcied that if the lines are not sorted will meet the same situation like uniq . So use sort depends on your files.
lines are not sorted
⌨ uniq -u broker.txt (wrong)
⌨ sort broker.txt | uniq -u