Команда Linux uniq перебирає ваші текстові файли, шукаючи унікальні або повторювані рядки. У цьому посібнику ми розповімо про його універсальність та особливості, а також про те, як ви можете максимально використовувати цю чудову утиліту.
Пошук відповідних рядків тексту в Linux
Команда uniq швидкий, гнучкий і чудовий у своїй справі. Однак, як і багато команд Linux, у ньому є кілька примх — це добре, якщо ви про них знаєте. Якщо ви зважитеся, не маючи трохи інсайдерських ноу-хау, ви цілком можете почухати голову над результатами. Ми будемо вказувати на ці примхи, як ми будемо.
Команда uniq ідеально підходить для цілеспрямованих, створених, щоб робити одну річ і робити це добре. Ось чому він також особливо добре підходить для роботи з трубами та відіграє свою роль у конвеєрах команд. Один із його найчастіші співробітники є сортуванням, тому що uniq повинен мати відсортовані вхідні дані для роботи.
Давайте запалимо!
Запуск uniq без параметрів
У нас є текстовий файл, який містить текст пісні Роберта Джонсона пісня Я вірю, що я витру свою мітлу. Давайте подивимося, що з цього робить uniq.
Ми введемо наступне, щоб передати вихід у менше:
uniq dust-my-broom.txt | less
Ми отримуємо всю пісню, включаючи повторювані рядки, менше:
Схоже, це не унікальні рядки чи повторювані рядки.
Правильно, тому що це перша примха. Якщо ви запускаєте uniq без параметрів, він веде себе так, ніби ви використовували параметр -u (унікальні рядки). Це вказує uniq друкувати лише унікальні рядки з файлу. Причина, по якій ви бачите повторювані рядки, полягає в тому, що для того, щоб uniq вважав рядок дублікатом, він повинен бути сусіднім із його дублікатом, саме тут і виконується сортування.
Коли ми сортуємо файл, він групує повторювані рядки, а uniq розглядає їх як дублікати. Ми будемо використовувати сортування у файлі, передати відсортований вихід у uniq, а потім передати кінцевий результат у менше.
Для цього вводимо наступне:
sort dust-my-broom.txt | uniq | less
Відсортований список рядків відображається в меншій частині.
Рядок «Я вірю, що притрушу мітлу», безперечно, з’являється в пісні не раз. Фактично, це повторюється двічі в перших чотирьох рядках пісні.
Отже, чому він відображається в списку унікальних рядків? Оскільки вперше рядок з’являється у файлі, він унікальний; лише наступні записи є дублікатами. Ви можете розглядати це як перелік першого входження кожного унікального рядка.
Давайте знову скористаємося сортуванням і перенаправимо вихід у новий файл. Таким чином, нам не потрібно використовувати сортування в кожній команді.
Вводимо таку команду:
sort dust-my-broom.txt > sorted.txt
sorted.txt” у вікні терміналу.’ width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);” onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”>
Тепер у нас є попередньо відсортований файл для роботи.
Підрахунок дублікатів
Ви можете використовувати параметр -c (лічильник), щоб надрукувати, скільки разів кожен рядок з’являється у файлі.
Введіть таку команду:
uniq -c sorted.txt | less
Кожен рядок починається з того, скільки разів цей рядок з’являється у файлі. Однак ви помітите, що перший рядок порожній. Це означає, що у файлі є п’ять порожніх рядків.
Якщо ви хочете, щоб вихідні дані були відсортовані в порядку чисел, ви можете передати вихідні дані з uniq у сортування. У нашому прикладі ми будемо використовувати параметри -r (зворотне) і -n (числове сортування) і передавати результати в менше.
Набираємо наступне:
uniq -c sorted.txt | sort -rn | less
Список сортується в порядку спадання на основі частоти появи кожного рядка.
Перелік лише повторюваних рядків
Якщо ви хочете бачити лише рядки, які повторюються у файлі, ви можете використовувати параметр -d (повторюється). Незалежно від того, скільки разів рядок дублюється у файлі, він відображається лише один раз.
Щоб використовувати цю опцію, ми вводимо наступне:
uniq -d sorted.txt
Дубльовані рядки перераховані для нас. Ви помітите порожній рядок угорі, що означає, що файл містить повторювані порожні рядки — це не простір, залишений uniq для косметичного зміщення списку.
Ми також можемо об’єднати параметри -d (повтор) і -c (підрахунок) і передати вихід через сортування. Це дає нам відсортований список рядків, які з’являються принаймні двічі.
Щоб скористатися цим параметром, введіть наступне:
uniq -d -c sorted.txt | sort -rn
Перелік усіх повторюваних рядків
Якщо ви хочете побачити список кожного дубльованого рядка, а також запис для кожного разу, коли рядок з’являється у файлі, ви можете використовувати параметр -D (усі повторювані рядки).
Щоб скористатися цією опцією, введіть наступне:
uniq -D sorted.txt | less
Перелік містить запис для кожного дубльованого рядка.
Якщо ви використовуєте параметр –group, він друкує кожен дубльований рядок з порожнім рядком або перед (попереду), або після кожної групи (додати), або обидва перед і після (обидва) кожної групи.
Ми використовуємо 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
Рядки «Я вірю, що я витру свою мітлу» та «Я вірю, що притрушу свою мітлу» не розглядаються як повторювані через різницю у регістрі «В» у «вірити».
Однак якщо ми включимо параметр -i (ігнорувати регістр), ці рядки вважатимуться повторюваними. Набираємо наступне:
uniq -d -c -i sorted.txt | sort -rn
Тепер рядки розглядаються як повторювані та згруповані разом.
Linux надає у ваше розпорядження безліч спеціальних утиліт. Як і багато хто з них, uniq не є інструментом, яким ви будете користуватися щодня.
Ось чому велика частина досвіду роботи з Linux полягає в тому, щоб запам’ятати, який інструмент вирішить вашу поточну проблему, і де ви можете знайти його знову. Але якщо ви практикуєтеся, ви будете на хорошому шляху.
Або ви завжди можете просто знайти How-To Geek — у нас, мабуть, є стаття про це.