Как использовать команду 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 — возможно, у нас есть статья об этом.
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts