Правилното използване на команди Find и Grep в Linux

Повечето начинаещи потребители на Unix-системи, по-специално Linux, не са запознати с основните оператори на командния ред, използвани в тази операционна система. Нека разгледаме по-отблизо функциите и използването на операторите find и grep.

Използване на команди Find и Grep в Linux.

НАМЕРИ

Командата Linux find е помощна програма за команден ред за преминаване към йерархията на файловете. Може да се използва за търсене на файлове и директории и извършване на последващи операции с тях. Той поддържа търсене по файл, папка, име, дата на създаване, дата на промяна, собственик и разрешения. Използвайки -exec, други UNIX команди могат да бъдат изпълнявани за намерени файлове или папки. синтаксис:

$ find [къде да започне търсенето] [изразът определя какво да се намери] [-опции] [какво да се намери]

възможности:

  • -exec - необходимия файл, който отговаря на горните критерии и връща 0 като изходно състояние за успешно изпълнение на команда;
  • -ok - работи същото като -exec, с изключение на това, че потребителят първо се подканва;
  • -inum N - търсене с номер "N";
  • -полета N - търсене с връзки "N";
  • -name demo - търсене на файлове, посочени в “demo”;
  • -newer file - търсене на файлове, които са били модифицирани / създадени след “file”;
  • -perm octal - търсене, ако резолюцията е осмична;
  • -print - показва пътя към документите, намерени по други критерии;
  • -празно - търсене на празни документи и директории;
  • - размер + N / N - блокове за търсене "N"; "N" и "c" могат да се използват за измерване на размера в символите; „+ N“ означава по-голям размер на „N“ блокове, а „N“ означава по-малък размер на „N“ блокове;
  • -user name - търсене на документи, принадлежащи на потребителското име или идентификатор "name";
  • (expr) - True, ако "expr" е вярно; Използва се за групиране на критерии във връзка с ИЛИ или И.

GREP

Командата grep се използва за търсене на файлове. Функцията означава "глобално отпечатване на регулярни изрази" и е една от най-мощните и често използвани команди в Linux. Командата търси един или повече входни файлове, които съответстват на посочения шаблон, и записва всеки съответния ред в стандартен изход. Ако не са зададени файлове, командата се чете от стандартния вход, който обикновено е изход на друга команда. В тази статия ще ви покажем как да въведете команда, с практически примери и подробни обяснения на най-често срещаните опции на GNU grep.

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

Преди да започнем да използваме командата, нека започнем с преглед на основния синтаксис. Изреченията за полезност имат следната форма:

[OPTIONS] PATTERN [ФАЙЛ ...]

Елементите в квадратни скоби не са задължителни.

  • ОПЦИИ - нула или повече възможности за избор. Екипът предоставя редица опции, които контролират поведението му.
  • PATTERN - Модел на търсене.
  • FILE - нула или повече имена на входни файлове.

Как да въведете команда за търсене на файлове

Основната цел на командата е да търси текст във файла. Например, за да се покаже от файла / etc / passwd, съдържащ bash ред, можете да използвате следната команда:

$ grep bash / etc / passwd

Изходът трябва да изглежда по следния начин:

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

domain1000: 1000: домейн: / начало / домейн: / bin / bash

Ако низът съдържа интервали, трябва да го заключите в единични или двойни кавички:

$ "Gnome Display Manager" / etc / passwd

Обърнете съвпадение (преди)

За да се покажат линии, които не съвпадат с шаблона, въведете параметъра –v (или –invert-match). Например, за да се покаже файл, който не съдържа nologin от файла / etc / passwd, можете да въведете следната команда:

$ -v nologin / etc / passwd

изход:

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

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

git 994: 994: git daemon потребител: /: / usr / bin / git-shell

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

Как да използвате командата за търсене в изхода

Вместо това, ако посочите входни файлове, можете да пренасочите изхода на друга команда и след това да покажете само редовете, които съответстват на посочения шаблон. Например, за да разберете кои процеси се изпълняват на вашата система като потребител на www-данни, можете да използвате следната команда:

$ ps -ef | WWW-данни

изход:

www-data 18247 12675 4 16:00? 00:00:00 php-fpm: басейн www

root 18272 17714 0 16:00 т. / 0 00:00:00 - цвят = автоматично - изключване - dir = .bzr - изключване - dir = CVS - изключване - dir = .git - изключване - dir = .hg - изключване - dir =. = .svn www-data

www-data 31147 12770 0 Oct22? 00:05:51 nginx: работен процес

www-data 31148 12770 0 Oct22? 00:00:00 процес nginx: кеш мениджър

Можете също да комбинирате няколко канала в екип. Както можете да видите в горния изход, има и ред, съдържащ процеса. Ако не искате тази линия да се показва, изпратете изхода на друг екземпляр, както е показано по-долу.

$ ps -ef | www-данни | grep -v grep

изход:

www-data 18247 12675 4 16:00? 00:00:00 php-fpm: басейн www

root 18272 17714 0 16:00 т. / 0 00:00:00 - цвят = автоматично - изключване - dir = .bzr - изключване - dir = CVS - изключване - dir = .git - изключване - dir = .hg - изключване - dir =. = .svn www-data

www-data 31147 12770 0 Oct22? 00:05:51 nginx: работен процес

www-data 31148 12770 0 Oct22? 00:00:00 процес nginx: кеш мениджър

Рекурсивно търсене

За да рекурсивно търсите шаблон, въведете опцията –r (или –recursive). Това ще ви позволи да търсите във всички файлове в указаната директория, като пропускате символични връзки, които се появяват рекурсивно. За да преминете през всички символни връзки, използвайте опцията –r (или –dereference-recursive). В следващия пример търсим domain.com във всички файлове в директорията / etc:

$ -r domain.com / и т.н.

Командата ще отпечата съответните полета с префикса на пълен файл.

/etc/hosts:127.0.0.1 node2.domain.com /etc/nginx/sites-available/domain.com: име_на сървъра domain.com www.domain.com;

Ако вместо –r използвате опцията –R, командата ще следва всички символни връзки:

$ -R domain.com / и т.н.

Обърнете внимание на последното поле за извеждане. Това не е отпечатано в примера по-горе, защото файловете в директорията Nginx с активирани сайтове са символични връзки към конфигурационни файлове в директорията, достъпна за сайтовете.

изход:

/etc/hosts:127.0.0.1 node2.domain.com

/etc/nginx/sites-available/domain.com: име_на сървъра domain.com www.domain.com;

/etc/nginx/sites-enabled/domain.com: име_на сървъра 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 Зебра / usr / share / words

Указанието „Зебра“ ще съответства на „Зебра“, „ZEbrA“ или друга комбинация от главни и малки букви.

изход:

зебра

зебра

зебри

Точно съвпадение

Когато търсите, gnu ще отпечата и gnu, в който се вмъкват по-големи думи, като cygnus или magnum.

$ gnu / usr / share / words

изход:

Малко Шарково

гну

безвластие

lgnu9d

Lignum

магнум

Магнусон

торфен мъх

Wingnut

За да се върнат само онези изрази, в които посоченото поле е цяла дума (не е затворено с думи), можете да използвате опцията –W (или - word-regexp).

ВАЖНО. Символите на думата включват буквено-цифрови символи (az, AZ и 0-9) и долни черти (_). Всички други символи се третират като невербални символи.

Ако изпълните същата команда както по-горе, включително опцията –w, командата ще върне само тези, които включват gnu като отделна дума.

$ grep -w gnu / usr / share / words

Изход: gnu

Показване на числа

За да се покаже броят на редовете, съдържащи шаблон, използвайте параметъра -n (или –line-number). Използването на тази опция ще отпечата съвпадения със стандартния изход с префикса на номера, в който е бил намерен. Например, за да се покаже от файла / etc / services, съдържащ префикса bash със съответния номер, можете да използвате следната команда:

$ grep -n 10000 / etc / services

Изходът по-долу показва, че съвпаденията са на 10423 и 10424.

изход:

10423: ndmp 10, 000 / tcp

10424: ndmp 10000 / udp

броене

За да отпечатате броя на съвпадащите редове към стандартния изход, използвайте параметъра –c (или –count). В примера по-долу преброяваме броя на акаунтите, които имат shell / usr / bin / zsh.

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

Изход: 4

Няколко реда (шаблона)

Операторът OR може да комбинира два или повече шаблона за търсене |. По подразбиране, командата интерпретира шаблона като основен редовен израз, в който метасимволите губят своето специфично значение и следва да се използват версиите им с обратна наклонена черта. В примера по-долу търсим всички появявания на думите fatal, error и critical в файла с грешки в Nginx:

$ grep 'fatal | грешка | критичен' /var/log/nginx/error.log

Ако използвате опцията за разширен редовен израз –E (или —extended-regexp), операторът не трябва да се избягва, както е показано по-долу:

$ grep -E 'фатална грешка | критична' /var/log/nginx/error.log

Редовен израз

GNU Grep има два набора от регулярни изрази - Basic и Extended. По подразбиране функцията интерпретира шаблона като основен регулярен израз, за ​​да превключи на разширени регулярни изрази, трябва да използвате опцията –E. Когато се използват регулярни изрази в основния режим, всички други символи, с изключение на метасимволи, всъщност са редовни изрази, които съответстват един на друг. По-долу е даден списък на най-често използваните метасимволи:

  • Използвайте символа ^ (символа на каретата), за да съответства на израза в началото на ред. В следващия пример, ^ кенгуру ще съвпадне само ако се появи в самото начало: $ grep "^ kangaroo" file.txt
  • Използвайте символа $ (долар), за да съответства на израза в края. В следващия пример, кенгуру $ ще съвпада само ако се срещне в самия край: grep "kangaroo $" file.txt
  • Използвайте символа. (точка), за да съответства на всеки един символ. Например, за да съответства на всичко, което започва с kan от два знака и завършва с roo, можете да използвате следния модел: $ grep "kan..roo" file.txt
  • Използвайте [] (скоби), за да съответствате на всеки един символ, затворен в скоби. Например, намерете тези, които съдържат акцепт или "акцент", можете да използвате следния модел: $ grep "acce [np] t" file.txt

За да избегнете специалното значение на следващия знак, използвайте символа (обратна наклонена черта).

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

За да интерпретирате шаблон като разширен редовен израз, използвайте параметъра -E (или -extended-regexp). Разширените регулярни изрази включват всички основни метасимволи, както и допълнителни метасимволи за създаване на по-сложни и мощни модели на търсене. По-долу са дадени няколко примера:

  • Съвпадение и извличане на всички имейл адреси от този файл: $ grep -E -o "[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] [0] (25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0-9]?) 5] | 2 [0-4] [0-9] | [01]? [0-9] [0-9]?) (25 [0-5] | 2 [0-4] [0-9] 9] | [01]? [0-9] [0-9]?) 'File.txt

Опцията -o се използва за отпечатване само на съвпадения.

Отпечатайте преди броене

За да отпечатате определен брой редове преди съвпадение, използвайте параметъра –B (или —по-контекст). Например, за да се покажат 5 реда първоначален контекст преди съвпадение, можете да използвате следната команда: $ grep -A 5 root / etc / passwd

Печат след търсене

За да отпечатате определен брой редове след съвпадение, използвайте параметъра –A (или – след-контекст). Например, за да се покажат 5 реда на крайния контекст след съответстващи низове, можете да използвате следната команда: $ grep -B 5 root / etc / passwd

Това е всичко необходимо за пълното използване на информацията от команди. Ако вече използвате Linux и можете да давате съвет на начинаещи, споделете коментарите си по тази статия.