Правильне використання команд Find і Grep в Linux

Більшість початківців користувачів Unix-систем, зокрема Linux, не знайомі з основними операторами командного рядка, які використовуються в цій ОС. Давайте більш детально розберемо функції і застосування операторів find і grep.

Використання команд Find і Grep в Linux.

FIND

Команда find в Linux - це утиліта командного рядка для обходу ієрархії файлів. Вона може застосовуватися для пошуку файлів і каталогів і виконання наступних операцій з ними. Вона підтримує пошук по файлу, папки, імені, дати створення, датою зміни, власнику та дозволами. Використовуючи -exec, інші команди UNIX можуть бути виконані для знайдених файлів або папок. синтаксис:

$ Find [з чого почати пошук] [вираз визначає, що знайти] [-Опції] [що знайти]

Опції:

  • -exec - шуканий файл, який відповідає вищезгаданим критеріям і повертає 0 в якості стану виходу для успішного виконання команди;
  • -ok - працює так само, як -exec, за винятком того, що користувачеві спочатку пропонується запит;
  • -inum N - пошук з номером «N»;
  • -links N - пошук з посиланнями «N»;
  • -name demo - пошук файлів, вказаних в «demo»;
  • -newer file - пошук файлів, які були змінені / створені після «file»;
  • -perm octal - пошук, якщо дозвіл «вісімкове»;
  • -print - показати шлях до документів, знайденим з використанням інших критеріїв;
  • -empty - пошук порожніх документів і каталогів;
  • -size + N / -N - пошук блоків «N»; «N» і «c» можуть використовуватися для вимірювання розміру в символах; «+ N» означає більший розмір «N» блоків, а «-N» означає менший розмір «N» блоків;
  • -user name - пошук документів, що належать імені користувача чи кодом «name»;
  • \ (Expr \) - True, якщо «expr» - true; використовується для угруповання критеріїв в поєднанні з OR або AND.

GREP

Команда grep використовується для пошуку в файлах. Функція позначає «глобальна друк регулярних виразів» і є однією з найпотужніших і часто застосовуваних команд в Linux. Команда шукає в одному або декількох вхідних файлах, відповідні заданим шаблоном, і записує кожну відповідний рядок в стандартний висновок. Якщо файли не вказані, команда читає зі стандартного вводу, яке зазвичай є висновком іншої команди. У цій статті ми покажемо вам, як вводити команду, на практичних прикладах і докладних пояснень найбільш поширених опцій GNU grep.

синтаксис команди

Перш ніж приступити до застосування команди, давайте почнемо з огляду основного синтаксису. Вирази утиліт мають наступну форму:

[OPTIONS] PATTERN [FILE ...]

Елементи в квадратних дужках не є обов'язковими.

  • OPTIONS - нуль або більше варіантів. Команда надає ряд опцій, які контролюють його поведінку.
  • PATTERN - Шаблон пошуку.
  • FILE - нуль або більше імен вхідних файлів.

Як вводити команду для пошуку в файлах

Основне призначення команди - пошук тексту в файлі. Наприклад, щоб відобразити з / etc / passwd файлу, що містить рядок bash, ви можете використовувати наступну команду:

$ Grep bash / etc / passwd

Висновок повинен виглядати приблизно так:

root 0: 0: root: / root: / bin / bash

domain1000: 1000: domain: / home / domain: / bin / bash

Якщо рядок містить прогалини, вам необхідно укласти її в одинарні або подвійні лапки:

$ «Gnome Display Manager» / etc / passwd

Invert Match (виключаючи)

Щоб відобразити лінії, які не відповідають шаблону, вводите параметр -v (або -invert-match). Наприклад, щоб відобразити з / etc / passwd файлу, які не містять nologin, ви можете ввести наступну команду:

$ -V nologin / etc / passwd

Output:

root 0: 0: root: / root: / bin / bash

colord 124: 124 :: / var / lib / colord: / bin / false

git 994: 994: git daemon user: /: / usr / bin / git-shell

linuxize 1000: 1000: linuxize: / home / linuxize: / bin / bash

Як застосовувати команду для пошуку в виведенні

Замість цього, якщо вказати вхідні файли, ви можете перенаправити висновок іншої команди, а потім відобразити тільки рядки, відповідні заданим шаблоном. Наприклад, щоб дізнатися, які процеси виконуються у вашій системі як користувач www-data, ви можете застосовувати таку команду:

$ Ps -ef | www-data

Output:

www-data 18247 12675 4 16:00? 00:00:00 php-fpm: pool www

root 18272 17714 0 16:00 pts / 0 00:00:00 -color = auto -exclude-dir = .bzr -exclude-dir = CVS -exclude-dir = .git -exclude-dir = .hg -exclude-dir = .svn www-data

www-data 31147 12770 0 Oct22? 00:05:51 nginx: worker process

www-data 31148 12770 0 Oct22? 00:00:00 nginx: cache manager process

Ви також можете об'єднати кілька каналів в команду. Як ви можете бачити у висновку вище, є також рядок, що містить процес. Якщо ви не хочете, щоб цей рядок відображалася, передайте висновок іншим примірником, як показано нижче.

$ Ps -ef | www-data | grep -v grep

Output:

www-data 18247 12675 4 16:00? 00:00:00 php-fpm: pool www

root 18272 17714 0 16:00 pts / 0 00:00:00 -color = auto -exclude-dir = .bzr -exclude-dir = CVS -exclude-dir = .git -exclude-dir = .hg -exclude-dir = .svn www-data

www-data 31147 12770 0 Oct22? 00:05:51 nginx: worker process

www-data 31148 12770 0 Oct22? 00:00:00 nginx: cache manager process

рекурсивний пошук

Для рекурсивного пошуку шаблону вводите опцію -r (або -recursive). Це дозволить виконати пошук по всіх файлів в зазначеному каталозі, пропускаючи символічні посилання, які зустрічаються рекурсивно. Щоб перейти по всім символьних посилань, використовуйте опцію -r (або -dereference-recursive). У наступному прикладі ми шукаємо domain.com у всіх файлах всередині каталогу / etc:

$ -R domain.com / etc

Команда надрукує відповідні поля з префіксом повного шляху до файлу.

/etc/hosts:127.0.0.1 node2.domain.com /etc/nginx/sites-available/domain.com: server_name domain.com www.domain.com;

Якщо замість -r ви застосовуєте опцію -R, команда буде дотримуватися всіх символьних посилань:

$ -R domain.com / etc

Зверніть увагу на останнє поле виведення. Це не друкується в прикладі вище, тому що файли у каталозі sites-enabled Nginx є символічними посиланнями на файли конфігурації всередині каталогу sites-available.

Output:

/etc/hosts:127.0.0.1 node2.domain.com

/etc/nginx/sites-available/domain.com: server_name domain.com www.domain.com;

/etc/nginx/sites-enabled/domain.com: server_name domain.com www.domain.com;

Показати тільки ім'я файлу

Щоб придушити висновок за замовчуванням і друкувати тільки імена файлів, що містять зіставлений шаблон, ви можете вводити опцію -l (або -files-with-matches). Наприклад, для пошуку по всіх файлів, що закінчується .conf в поточному робочому каталозі, і друку тільки імен файлів, що містять тип domain.com, введіть:

$ -L domain.com * .conf

Висновок буде виглядати приблизно так:

tmux.conf

haproxy.conf

Варіант -l зазвичай застосовується в поєднанні з рекурсивної опції -R:

$ -Rl domain.com / tmp

Нечутливість до регістру

За замовчуванням команда чутлива до регістру, що означає, що великі та малі символи розглядаються як різні. Щоб ігнорувати регістр при пошуку, вводите опцію -i (або -ignore-case). Наприклад, при пошуку Zebra без будь-якої опції наступна команда не буде відображати ніяких вихідних даних, тобто є збігаються.

$ Zebra / usr / share / words

Але якщо ви виконаєте пошук без урахування регістру, застосовуйте опцію -i, він буде відповідати як заголовних, так і рядковим буквах:

$ Grep -i Zebra / usr / share / words

Вказівка ​​«Zebra» відповідатиме «Zebra», «ZEbrA» або будь-який інший комбінації великих і малих літер.

Output:

zebra

zebra's

zebras

Точне співпадіння

При пошуку gnu також буде друкувати gnu, в які вставлені більші слова, такі як cygnus або magnum.

$ Gnu / usr / share / words

Output:

cygnus

gnu

interregnum

lgnu9d

lignum

magnum

magnuson

sphagnum

wingnut

Щоб повернути тільки ті вирази, в яких вказане поле являє собою ціле слово (укладену не в словах), ви можете використовувати опцію -w (або -word-regexp).

ВАЖЛИВО. Символи слова включають букви і цифри символи (az, AZ та 0-9) і підкреслення (_). Всі інші символи розглядаються як несловесні символи.

Якщо ви запустите ту ж команду, що і вище, включаючи опцію -w, команда поверне тільки ті, які включають gnu в якості окремого слова.

$ Grep -w gnu / usr / share / words

Output: gnu

Показати номери

Щоб показати кількість рядків, що містять шаблон, використовуйте параметр -n (або -line-number). При використанні цієї опції буде друкувати збіги на стандартний висновок з префіксом номера, в якій він був знайдений. Наприклад, для відображення з файлу / etc / services, що містить префікс bash з відповідним номером, ви можете використовувати наступну команду:

$ Grep -n 10000 / etc / services

Висновок нижче показує, що збіги перебувають в 10423 і 10424.

Output:

10423: ndmp 10000 / tcp

10424: ndmp 10000 / udp

підрахунок

Щоб надрукувати кількість співпадаючих рядків в стандартний висновок, використовуйте параметр -c (або -count). У наведеному нижче прикладі ми підраховуємо кількість облікових записів, які мають оболонку / usr / bin / zsh.

$ Grep -c '/ usr / bin / zsh' / etc / passwd

Output: 4

Кілька рядків (патернів)

Оператор АБО може об'єднати два або більше шаблонів пошуку |. За замовчуванням команда інтерпретує шаблон як основне регулярний вираз, в якому метасимволу втрачають своє особливе значення, і їх версії з зворотною косою межею повинні використовуватися. У наведеному нижче прикладі ми шукаємо все входження слів fatal, error і critical в файлі журналу реєстрації помилок Nginx:

$ Grep 'fatal \ | error \ | critical' /var/log/nginx/error.log

Якщо ви використовуєте опцію розширеного регулярного виразу -E (або -extended-regexp), оператор не повинен бути екранований, як показано нижче:

$ Grep -E 'fatal | error | critical' /var/log/nginx/error.log

Регулярний вираз

GNU Grep має два набори функцій регулярних виразів - Basic і Extended. За замовчуванням функція інтерпретує шаблон як базове регулярний вираз, щоб переключитися на розширені регулярні вирази, вам необхідно використовувати опцію -E. При використанні в основному режимі регулярних виразів всі інші символи, крім метасимволов, насправді є регулярними виразами, які відповідають один одному. Нижче наведено список найбільш часто використовуваних метасимволов:

  • Використовуйте символ ^ (символ каретки), щоб відповідати висловом на початку рядка. У наступному прикладі ^ kangaroo буде відповідати, тільки якщо вона зустрічається на самому початку: $ grep «^ kangaroo» file.txt
  • Використовуйте символ $ (долар), щоб відповідати висловом в кінці. У наступному прикладі kangaroo $ відповідатиме тільки в тому випадку, якщо вона зустрічається в самому кінці: grep «kangaroo $» file.txt
  • Використовуйте символ. (Точка), щоб відповідати будь-якому окремому символу. Наприклад, для зіставлення всього, що починається з kan двох символів і закінчується roo, можна використовувати наступний шаблон: $ grep «kan..roo» file.txt
  • Використовуйте [] (дужки) для відповідності будь-якому окремому символу, укладеним в дужки. Наприклад, знайдіть ті, які містять accept або «accent, ви можете використовувати наступний шаблон: $ grep« acce [np] t »file.txt

Щоб уникнути спеціального значення наступного символу, використовуйте символ \ (зворотний слеш).

Розширені регулярні вирази

Щоб інтерпретувати шаблон як розширене регулярний вираз, використовуйте параметр -E (або -extended-regexp). Розширені регулярні вирази включають в себе всі основні метасимволу, а також додаткові метасимволу для створення більш складних і потужних шаблонів пошуку. Нижче наведені деякі приклади:

  • Зіставте і витягніть всі адреси електронної пошти з даного файлу: $ grep -E -o «\ b [A-Za-z0-9 ._% + -] [A-Za-z0-9 .-] + \. [A-Za-z] {2, 6} \ b »file.txt
  • Зіставте і витягніть всі дійсні IP-адреси з даного файлу: $ grep -E -o '(25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0 -9]?) \. (25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0-9]?) \. (25 [0- 5] | 2 [0-4] [0-9] | [01]? [0-9] [0-9]?) \. (25 [0-5] | 2 [0-4] [0- 9] | [01]? [0-9] [0-9]?) 'file.txt

Опція -o використовується для друку тільки відповідності.

Друк перед підрахунком

Щоб надрукувати певну кількість рядків перед відповідністю, використовуйте параметр -B (або -before-context). Наприклад, щоб відобразити 5 рядків початкового контексту перед зіставленням, ви можете використовувати наступну команду: $ grep -A 5 root / etc / passwd

Друк після пошуку

Щоб надрукувати певну кількість рядків після зіставлення, використовуйте параметр -A (або -after-context). Наприклад, щоб відобразити 5 ліній кінцевого контексту після зіставлення рядків, ви можете використовувати наступну команду: $ grep -B 5 root / etc / passwd

Це вся необхідна для повноцінного застосування команд інформація. Якщо ви вже використовуєте Linux і можете дати будь-які поради початківцям, поділіться коментарями під цією статтею.