П’ять прикладів використання grep
Утиліта grep – це дуже потужний засіб для пошуку та фільтрації текстової інформації. У цій статті показано кілька прикладів її використання, які дозволять належним чином оцінити її можливості. Основна сфера застосування grep – пошук слів чи фраз у файлах та потоках виведення. Ви можете здійснити пошук, набравши в командному рядку запит та область пошуку (файл). Наприклад, щоб знайти рядок “needle” у файлі hystack.txt використовуйте таку команду:
В результаті grep відобразить усі входження needle, які він зустріне у вмісті файлу haystack.txt. Важливо зауважити, що в цьому випадку grep шукає саме набір символів, а не слово. Наприклад, буде відображено рядки, що включають слово “needless” та інші слова, у яких зустрічається послідовність “needle”.
Щоб вказати grep, що ви шукаєте саме слово, використовуйте ключ -w. Цей ключ обмежить пошукову область лише вказаним словом. Під словом мається на увазі запит, обмежений з обох сторін будь-якими символами пробілів, знаками пунктуації або переносами рядка.
Не обов'язково обмежувати область пошуку лише одним файлом, grep може виконувати пошук і за групою файлів, причому у результатах пошуку буде вказано файл, у якому виявлено збіг. Ключ -n додасть ще номер рядка, в якому виявлено збіг, а ключ -r дозволить виконати рекурсивний пошук. Це дуже зручно під час пошуку серед файлів з вихідними текстами програм.
Параметр -o показує grep, що слід виводити лише збіг із шаблоном, а чи не весь рядок. Висновок grep за допомогою pipe перенаправляємо команді tail, яка за умовчанням виводить 10 останніх рядків. Тепер ми підрахуємо кількість повідомлень, надісланих до irc-каналу певними користувачами. Наприклад, всі повідомлення, які я надіславз дому та з роботи. Вони відрізняються за нікнеймом, вдома я використовую нік user_at_home, а на роботі user_at_work.
З параметром -c grep виводить лише кількість знайдених збігів, а чи не самі збіги. Рядок пошуку укладено в лапки тому, що в ній містяться спеціальні символи, які можуть бути розпізнані оболонкою як керуючі. Зверніть увагу, що лапки не входять до шаблону пошуку. Зворотний слеш "" служить для екранування службових символів. Здійснимо пошук за повідомленнями людей, які люблять “кричати” у каналі. Під “криком” ми розуміємо повідомлення, написані в blondy-style, одними величезними літерами. Щоб виключити з пошуку випадкові попадання абревіатур, шукатимемо слова з п'яти і більше символів:
За більш детальним описом можна звернутися до сторінки посібника man grep.Ще кілька прикладів:
Відображає рядки з файлу /etc/passwd, де є рядок root.
Відображаються, крім того, номери рядків, у яких є рядок, що шукається.
Підраховує кількість облікових записів, у яких командною оболонкою вказано /bin/false.
У цій команді відображаються рядки всіх файлів домашнього каталогу поточного користувача, імена яких починаються з
/.bash, за винятком тих файлів, в іменах яких є рядок history, для того, щоб виключити відповідності, наявні у файлі
/.bash_history, в якому може бути вказано один і той же рядок у верхньому або нижньому регістрах. Зверніть увагу, що здійснюється пошук слова "games", замість нього можна підставити будь-яке інше.Команда grep та регулярні вирази
На відміну від попереднього прикладу, тепер відобразимо лише ті рядки, які починаються з рядка root:
Якщо ми хочемо побачити, у яких облікових записахкомандна оболонка взагалі не використовувалася, ми шукаємо рядки, що закінчуються сиволом «:»:
Щоб перевірити, чи експортується до файлу
/.bashrc змінна PATH, спочатку виберіть рядки з "export", а потім знайдіть рядки, що починаються з рядка "PATH"; у такому разі не будуть відображатися MANPATH та інші можливі шляхи:
Символьні класи
Виразом у квадратних дужках є список символів, укладених усередині символів [" та "]"". Воно відповідає будь-якому одиночному символу, зазначеному у цьому списку; якщо перший символ списку є «^», воно відповідає будь-якому символу, який ВІДСУТНІЙ у списку. Наприклад, регулярне вираз [0123456789]"" відповідає будь-якій одиночній цифрі.
Всередині виразу у квадратних дужках можна вказувати діапазон, що складається із двох символів, розділених дефісом. Тоді вираз відповідає будь-якому одиночному, який згідно з правилами сортування потрапляє всередину цих двох символів, включаючи ці два символи; при цьому враховується послідовність упорядкування та набір символів, вказаних у локалі. Наприклад, коли за умовчанням вказано локаль C, вираз [a-d]"" еквівалентний виразу [abcd]"". Є багато локалей, у яких сортування виконується в словниковому порядку, і в цих локалях [a-d]"", як правило, не еквівалентно [abcd]"", в них, наприклад, воно може бути еквівалентне виразу [aBbCcDd]"". Щоб використовувати традиційну інтерпретацію виразу, що вказується у квадратних дужках, ви можете скористатися локаллю C, встановивши для цього в змінній оточенні LC_ALL значення «C».
Нарешті, є певним чином названі символьні класи, які вказуються всередині виразів у квадратних дужках. Додаткову інформацію про ці зумовлені вирази дивіться насторінках людей або в документації команди grep.
У прикладі відображаються всі рядки, що містять символ «y», або символ «f».Універсальні символи (метасимволи)
Використовуйте "." для пошуку відповідності будь-якому одиночному символу. Якщо ви хочете отримати список усіх англійських слів, взятих зі словника, що містять п'ять символів, що починаються з «c» і закінчуються «h» (зручно для вирішення кросвордів):
Якщо ви бажаєте відобразити рядки, в яких є символ точки у вигляді літералу, то вкажіть у команді grep параметр -F. Символи " » означають наявність порожнього рядка до і відповідно після вказаних букв. Це означає, що слова у файл words повинні бути записані відповідним чином. Якщо ви хочете знайти всі слова в тексті за вказаним шаблоном без урахування порожніх рядків опустіть символи " », для точного пошуку тільки слів використовуйте ключ -w.
Щоб подібним чином знайти слова, у яких між «c» і «h» може бути будь-яке число символів, використовуйте зірочку (*). У наведеному нижче прикладі із системного словника вибираються всі слова, що починаються з «c» і закінчуються символом «h»:
Якщо ви хочете знайти у файлі або вихідному потоці літеральний символ «зірочка», використовуйте одинарні лапки. Користувач у наведеному нижче прикладі спочатку намагається у файлі /etc/profile знайти "зірочку" без використання лапок, внаслідок чого нічого не знаходиться. Коли використовуються лапки, у вихідний потік видається результат: