Повторяющие строки не часто становятся проблемой,
но иногда это так. И когда это происходит, требуется дополнительная работа
для их отфильтровки. Утилита uniq в этом деле очень полезна. Посмотрите, как вы можете сэкономить свое время и избежать головной боли.
После сортировки текстового файла вы можете заметить, что некоторые строки
повторяются. Иногда эта повторяющаяся информация не нужна и может быть удалена
для сохранения места на диске. Строки в файле не обязательно сортировать,
но вы должны помнить, что uniq сравнивает строки по мере прочтения и удаляет
только две или больше соседних строк. Следующие примеры показывают как это работает на практике:
Листинг 1. Удаление сдвоенных строк при помощи uniq
$ cat happybirthday.txt
Happy Birthday to You!
Happy Birthday to You!
Happy Birthday Dear Tux!
Happy Birthday to You!
$ sort happybirthday.txt
Happy Birthday Dear Tux!
Happy Birthday to You!
Happy Birthday to You!
Happy Birthday to You!
$ sort happybirthday.txt | uniq
Happy Birthday Dear Tux!
Happy Birthday to You!
Помните, что это плохая идея - использовать uniq или другие утилиты для удаления
повторяющихся строк в файлах, содержащих финансовую или другую важную информацию.
В таких файлах повторяющиеся строки обозначают ещё один перевод денег на
тот же счет и удаление их может привести к проблемам в отношениях с налоговыми
органами. Не делайте этого!
Что, если вы хотите сделать свою работу проще и вывести только уникальные
или только повторяющиеся строки из файла? Вы можете сделать это при помощи
опций -u (unique) и -d (duplicate):
Листинг 2. Применение опций -u и -d
$ sort happybirthday.txt | uniq -u
Happy Birthday Dear Tux!
$ sort happybirthday.txt | uniq -d
Happy Birthday to You!
Вы можете также получить некоторую статистику при помощи опции -c:
Листинг 3. Использование опции -c
$ sort happybirthday.txt | uniq -uc
1 Happy Birthday Dear Tux!
$ sort happybirthday.txt | uniq -dc
3 Happy Birthday to You!
Сравнение целых строк очень полезно, но это - не последняя возможность
этой команды. Очень хороша возможность пропускать указанные при помощи опции
-f поля. Это может пригодиться при просмотре системных логов. Использование
простой uniq не будет работать, так как каждая строка имеет свою отметку
времени. Но если вы укажете uniq пропустить все поля времени, то, неожиданно, ваш лог станет гораздо более понятным. Попробуйте uniq -f 3 /var/log/messages и убедитесь сами.
Есть еще одна опция -s, которая работает так же, как и -f,
но пропускает указанное количество символов. Вы можете использовать -s и
-f вместе. Сначала удалите поля, а затем символы. А что, если вы захотите
увидеть строки, только с данными символами? Попробуйте опцию -w.
Вы можете узнать гораздо больше об этой утилите если откроете окно терминала и введете команду man uniq или info uniq, либо запустите браузер и просмотрите man-страницу uniq на gnu.org.