Поиск по сайту:

Как использовать команду uniq в Linux


Команда Linux uniq просматривает ваши текстовые файлы в поисках уникальных или повторяющихся строк. В этом руководстве мы расскажем о его универсальности и функциях, а также о том, как вы можете максимально использовать эту изящную утилиту.

Поиск совпадающих строк текста в Linux

Команда uniq быстрая, гибкая и прекрасно справляется со своими задачами. Однако, как и у многих команд Linux, у него есть несколько особенностей, и это нормально, если вы знаете о них. Если вы сделаете решительный шаг без каких-либо инсайдерских ноу-хау, вы вполне можете почесать голову над результатами. Мы будем указывать на эти причуды по ходу дела.

Команда uniq идеально подходит для целеустремленных людей, созданных для того, чтобы делать одно дело и делать это хорошо. Вот почему он также особенно хорошо подходит для работы с каналами и играет свою роль в конвейерах команд. Одним из наиболее частых помощников является sort, потому что uniq должен иметь отсортированный ввод для работы.

Давайте зажжем!

Запуск uniq без опций

У нас есть текстовый файл, содержащий текст песни Роберта Джонсона I Believe I’ll Dust My Broom. Давайте посмотрим, что из этого сделает uniq.

Мы введем следующее, чтобы направить вывод в less:

uniq dust-my-broom.txt | less

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

Это не похоже ни на уникальные строки, ни на повторяющиеся строки.

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

Когда мы сортируем файл, он группирует повторяющиеся строки, и uniq обрабатывает их как дубликаты. Мы будем использовать sort для файла, направить отсортированный вывод в uniq, а затем направить окончательный вывод в less.

Для этого набираем следующее:

sort dust-my-broom.txt | uniq | less

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

Строка «Кажется, я вытру свою метлу» определенно появляется в песне не раз. Фактически, это повторяется дважды в первых четырех строках песни.

Итак, почему он отображается в списке уникальных строк? Поскольку строка, впервые появившаяся в файле, уникальна; дублируются только последующие записи. Вы можете думать об этом как о перечислении первых вхождений каждой уникальной строки.

Давайте снова воспользуемся sort и перенаправим вывод в новый файл. Таким образом, нам не нужно использовать sort в каждой команде.

Набираем следующую команду:

sort dust-my-broom.txt > sorted.txt

Теперь у нас есть предварительно отсортированный файл для работы.

Подсчет дубликатов

Вы можете использовать параметр -c (количество), чтобы напечатать количество раз, которое каждая строка появляется в файле.

Введите следующую команду:

uniq -c sorted.txt | less

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

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

Набираем следующее:

uniq -c sorted.txt | sort -rn | less

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

Список только повторяющихся строк

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

Чтобы использовать эту опцию, мы набираем следующее:

uniq -d sorted.txt

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

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

Введите следующее, чтобы использовать эту опцию:

uniq -d -c sorted.txt | sort -rn

Список всех повторяющихся строк

Если вы хотите увидеть список каждой повторяющейся строки, а также запись о каждом появлении строки в файле, вы можете использовать параметр -D (все повторяющиеся строки).

Чтобы использовать эту опцию, введите следующее:

uniq -D sorted.txt | less

Листинг содержит запись для каждой дублированной строки.

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

Мы используем append в качестве модификатора, поэтому вводим следующее:

uniq --group=append sorted.txt | less

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

Проверка определенного количества символов

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

В этом примере мы повторим последнюю команду, но ограничим сравнения первыми тремя символами. Для этого набираем следующую команду:

uniq -w 3 --group=append sorted.txt | less

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

Все строки, начинающиеся с «I b», сгруппированы вместе, потому что эти части строк идентичны, поэтому они считаются дубликатами.

Точно так же все строки, начинающиеся с «я», рассматриваются как дубликаты, даже если остальная часть текста отличается.

Игнорирование определенного количества символов

В некоторых случаях может быть полезно пропустить определенное количество символов в начале каждой строки, например, когда строки в файле пронумерованы. Или, скажем, вам нужно uniq перепрыгнуть через метку времени и начать проверку строк с шестого символа, а не с первого символа.

Ниже представлена версия нашего отсортированного файла с пронумерованными строками.

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

uniq -s 3 -d -c numbered.txt

Строки обнаруживаются как дубликаты и учитываются правильно. Обратите внимание, что отображаемые номера строк соответствуют первому вхождению каждого дубликата.

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

Мы вводим следующее, чтобы указать uniq игнорировать первое поле:

uniq -f 1 -d -c  numbered.txt

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

Игнорирование дела

По умолчанию uniq чувствителен к регистру. Если одна и та же буква отображается с прописными буквами и в нижнем регистре, uniq рассматривает строки как разные.

Например, проверьте вывод следующей команды:

uniq -d -c sorted.txt | sort -rn

Строки «Я верю, что вытру свою метлу» и «Я верю, что вытру свою метлу» не рассматриваются как дубликаты из-за разницы в регистре букв «B» в слове «верю».

Однако если мы включим параметр -i (игнорировать регистр), эти строки будут рассматриваться как дубликаты. Набираем следующее:

uniq -d -c -i sorted.txt | sort -rn

Строки теперь рассматриваются как дубликаты и группируются вместе.

Linux предоставляет в ваше распоряжение множество специальных утилит. Как и многие из них, uniq — это не инструмент, который вы будете использовать каждый день.

Вот почему большая часть освоения Linux заключается в том, чтобы помнить, какой инструмент решит вашу текущую проблему и где вы можете найти его снова. Однако, если вы будете практиковаться, у вас все получится.

Или вы всегда можете просто выполнить поиск How-To Geek — возможно, у нас есть статья об этом.

RELATED: Best Linux Laptops for Developers and Enthusiasts