Команда Linux `look` є інструментом для пошуку в файлах, що виводить рядки, які починаються з заданого слова чи фрази. Однак, важливо враховувати, що поведінка цієї команди може відрізнятися залежно від дистрибутива Linux. Цей посібник допоможе вам розібратися в особливостях її використання.
Відмінності в поведінці команди look в Ubuntu
Під час дослідження цієї команди, я зіткнувся з двома проблемами: несумісністю між дистрибутивами та неточностями в документації. Стаття була перевірена на Ubuntu, Fedora та Manjaro, де команда `look` була доступна. Проте, версія в Ubuntu відрізнялася від інших.
Згідно з офіційною документацією Ubuntu, поведінка команди повинна бути ідентичною в усіх дистрибутивах, але це не так. Традиційно `look` використовує бінарний пошук, в той час як версія Ubuntu застосовує лінійний пошук. Документація на сторінках Ubuntu для версій Bionic Beaver (18.04), Cosmic Cuttlefish (18.10) і Disco Dingo (19.04) стверджує, що використовується бінарний пошук, що не відповідає дійсності.
Якщо переглянути локальну довідку Ubuntu через `man look`, то можна побачити, що використовується саме лінійний пошук. Є параметр командного рядка, який дозволяє використовувати бінарний пошук. Інші дистрибутиви такої опції не мають.
man look
Прокручуючи сторінку керівництва вниз, можна знайти розділ, де описано використання лінійного пошуку в цій версії команди `look`.
Висновок: завжди перевіряйте локальні сторінки керівництва.
Порівняння лінійного та бінарного пошуку
Бінарний пошук є ефективнішим та швидшим за лінійний, особливо при роботі з великими файлами. Головний недолік бінарного пошуку – необхідність сортування файлу. Якщо сортування неприйнятне, то можна створити відсортовану копію і працювати з нею.
Далі ми продемонструємо це на практиці. Важливо пам’ятати, що у Fedora, Manjaro та більшості інших дистрибутивів Linux потрібно створювати відсортовану копію файлу для роботи з командою `look`.
Встановлення словника
Команда `look` може використовувати будь-який текстовий файл, або системний файл словника “words”.
Для Manjaro необхідно окремо встановити словник. Скористайтеся командою:
sudo pacman -Syu words
Практичне використання look
Для демонстрації ми використаємо вірш Едварда Ліра “Джамблії”.
Переглянемо його вміст командою:
less the-jumblies.txt
Ось початок вірша. Ми працюємо в Ubuntu, тому файл залишається невідсортованим. Для Fedora і Manjaro будемо використовувати відсортовану копію, що розглянемо далі.
Щоб знайти рядки, які починаються зі слова “Вони”, введемо команду:
look They the-jumblies.txt
Команда `look` виведе рядки, що починаються зі слова “Вони”:
Ігнорування регістру
Для ігнорування різниці між верхнім та нижнім регістром використовуйте параметр `-f` (ignore-case). Використаємо слово “вони” з нижнього регістру:
look -f they the-jumblies.txt
Результат тепер включає додатковий рядок:
Рядок, що починається з “ВОНИ”, був пропущений раніше, оскільки написаний у верхньому регістрі. Ігнорування регістру дозволяє `look` включити його до результатів.
Використання з відсортованим файлом
Якщо ваш дистрибутив Linux використовує бінарний пошук, необхідно сортувати файл або працювати з відсортованою копією. Повторимо пошук слова “Вони” на Manjaro.
Результатів немає. Але ми знаємо, що у вірші є рядки, що починаються зі слова “Вони”.
Зробимо відсортовану копію файлу. Якщо використовуєте параметри `-f` (ігнорувати регістр) або `-d` (лише літери, цифри та пробіли), їх потрібно застосовувати і при сортуванні.
Параметр `-o` (output) дозволяє вказати ім’я файлу для збереження відсортованих рядків. В цьому прикладі це “sorted.txt”.
sort -f -d the-jumblies.txt -o sorted.txt
Використаємо `look` для файлу `sorted.txt` з параметрами `-f` та `-d`.
Тепер ми отримали очікувані результати.
Ігнорування символів, крім букв, цифр та пробілів
Для ігнорування всього, що не є літерою, цифрою або пробілом, використовуйте параметр `-d` (alphanumeric). Пошукаємо слова, що починаються на “О”.
look -f oh the-jumblies.txt
Команда `look` не знайшла збігів.
Повторимо команду, попросивши `look` ігнорувати все, крім літер, цифр та пробілів. Таким чином, розділові знаки будуть ігноровані.
look -f -d oh the-jumblies.txt
Тепер маємо результат. Раніше ми не знаходили цей рядок, бо лапки та знак оклику заважали пошуку.
Визначення кінцевого символу
Можна вказати символ закінчення. Зазвичай це пробіли та кінець рядка.
Параметр `-t` (terminating character) дозволяє вказати необхідний символ. В цьому прикладі використаємо апостроф. Потрібно ввести його в лапках зі зворотньою косою рискою, щоб `look` сприйняв його як символ, а не частину команди. Ми також беремо в лапки пошуковий термін, бо він містить пробіл. Шукаємо два слова.
look -f -t ' "they call" the-jumblies.txt
Результат відповідає пошуковому терміну, що закінчується на апостроф.
Використання look без файлу
Якщо не вказати файл, то `look` використовує файл словника.
Команда:
виведе:
Це всі слова з словника, що починаються зі слова “коло”.
Підсумки
Команда `look` є досить простим інструментом, якщо врахувати відмінності в її поведінці в різних дистрибутивах Linux та визначити, який тип пошуку (бінарний чи лінійний) використовується у вашій системі.