Grep e много популярна Linux команда. Тя има широка употреба при работа с файлове и директории, като се използва за търсене на последователност от символи. Подобни операции се извършват постоянно, както от стандартни потребители, така и от разработчици.
Ако е открито съвпадение с подадените символи, за резултат се извеждат всички редове, които съдържат търсения низ или друга информация, указана чрез опции.
Употреба на комендата grep във файлове
Да разгледаме пример с файла Hosting.txt. Той съдържа следния текст:
“1 Delta е една от водещите хостинг компании в страната.
2 Компанията е специализирана в изграждането на Cloud услуги.
3 Ценностите на delta са изцяло фокусирани върху нуждите на клиента.
4 DELTA предлага на своите клиенти широк спектър от облачни решения.
5 Всеки клиент е важен.”
Ако искаме да намерим в споменатия файл конкретна последователност от символи, например “Delta”, е необходимо да употребим grep с най-базовия синтаксис: име на команда, низ от символи, име на файл.
grep Delta Hosting.txt
grep “Delta” Hosting.txt
Върнатият резултат ще представлява всички редове, които съдържат “Delta”. В нашия случай резултатът ще е само един (ред 1), поради чувствителността на командата към главни и малки букви.
*Обикновено резултатите се визуализират с оцветяване на намерения съвпадащ низ. Ако системата, с която работите, не го оцветява в различен цвят, то използвайте --color
Синтаксис:
grep --color "Delta” Hosting.txt
В случай, че желаем тази чувствителност да не се взема под внимание, е необходимо да използваме опция -i. Командният ред ще изглежда по следния начин:
grep -i Delta Hosting.txt
Резултатът, който ще бъде върнат, включва редове 1, 3 и 4. Символните низове Delta, DELTA и delta ще бъдат разглеждани като еднакви.
Това не е единствената опция, която ще улесни работата ни с командата. Понякога са нужни по-специфични търсения във файл и благодарение на богатата база от опции на grep, е възможно търсене по определени условия.
Други полезни опции на командата grep
А ето и още полезни опции за командата grep в Linux:
Извеждане на брой редове, в които фигурира търсения низ
Тази операция се извършва с помощта на опция -c.
grep -c "Delta" Hosting.txt
Върнат резултат:
1
Извеждане на редовете, които започват или свършват с търсения низ
Друга полезна и по-конкретна опция е извеждане на всички редове, които започват с търсен низ. Символът “^” обозначава започването на ред. Със следния шаблон могат да се изведат споменатите редове:
grep "^1" Hosting.txt
Върнат резултат:
1. Delta е една от водещите хостинг компании в страната.
Аналогично на предходната опция, ни е необходим символ, с който да обозначим, че търсим редове, завършващи с търсения низ. Използваме символ “$” и командата ще изглежда по следния начин:
grep "услуги.$" Hosting.txt
*да не се пропуска, че изреченията вероятно завършват с точка, която не трябва да бъде изпусната.
Намиране на цяла дума
Както вече споменахме, grep търси последователност от символи. Те могат да фигурират в друга, по-голяма символна група. Има начин да филтрираме и открием самостоятелните думи, благодарение на опцията -w.
Ако отново във файл Hosting.txt се търси думата “клиент”, то при базов синтаксис:
grep клиент Hosting.txt
Върнати резултати ще са редове 3, 4 и 5, защото съдържат думите: клиента, клиенти клиент.
Когато искаме със сигурност да намерим думата “клиент”, следва да подадем командата така:
grep -w клиент Hosting.txt
В този случай резултат ще е ред 5: “5 Всеки клиент е важен ”, защото търсеният низ точно отговаря на думата.
Извеждане само на съвпадащия низ
Тази операция е достъпна, благодарение на опция -o. Тя ще върне списък с всички символни поредици, които отговарят на зададеното търсене.
grep -o "Delta" Hosting.txt
Връщане на съвпадение и номер на ред
Когато работите с голям файл, със сигурност ще намерите приложение и на опцията -n. Командата grep, в комбинация с тази опция, връща съдържанието на реда, в който има съвпадение, но и номер на конкретния ред. Например:
grep -n "Delta" Hosting.txt
Върнат резултат
1: 1 Delta е една от водещите хостинг компании в страната.
Обратна операция на търсене
Искате да намерите всички редове, в които не фигурира даден низ? Командата grep ще ви помогне и в този случай, заедно с опцията -v.
grep -v "Delta" Hosting.txt
Резултат:
2 Компанията е специализирана в изграждането на Cloud услуги.
3 Ценностите на delta са изцяло фокусирани върху нуждите на клиента.
4 DELTA предлага на своите клиенти широк спектър от облачни решения.
5 Всеки клиент е важен.
Извеждане на специфични редове от файлове, с две основни опции
Grep Ви предоставя възможност да търсите ред със специфичен низ, а чрез добавяне на -A ще бъдат изведени и следващите n редове.
grep -A1 "Ценностите" Hosting.txt
Резултат:
3 Ценностите на delta са изцяло фокусирани върху нуждите на клиента.
4 DELTA предлага на своите клиенти широк спектър от облачни решения.
Опцията -B[n] е аналогична, но връща n на брой редове преди този със съвпадение:
grep -B1 "Ценностите" Hosting.txt
Резултат:
2 Компанията е специализирана в изграждането на Cloud услуги.
3 Ценностите на delta са изцяло фокусирани върху нуждите на клиента.
Работа на grep в директории
А ето и практически примери как да използвате Linux командата grep в директории:
Извеждане на имената на всички файлове от директория, в които фигурира търсения низ
Командата ще се изпълни в този си вид, в комбинация с опция -l, като проверката ще се изпълни в текущата директория.
grep -l "Delta" *
Символът * основно означава “Всичко/ Всички” в Linux. Вместо него, в този случай, могат да бъдат изброени файлове, които да се обходят.
grep -l "Delta" file1.txt file2.txt Hosting.txt
Рекурсивно търсене в директория
С grep командата може да се обхожда текущата директория и рекурсивно нейните поддиректории, търсейки конкретен низ.
grep -R "Delta" *
С командния ред ще бъде потърсен текстът “Delta” във всички файлове, които се съдържат в текущата директория и нейните дъщерни такива.
Като върнат резултат се визуализират редове, които съдържат:
име/път-на-файл:ред със съвпадение
Hosting.txt:1 Delta е една от водещите хостинг компании в страната.
Полезни примери и употреба на последователност от операции
Употребата на grep може да е много полезна и в комбинация с редица команди, както и със самата себе си. Подготвили сме Ви полезни примери, в които да разкрием част от потенциала ѝ.
Последователност от операции
Ако се нуждаете от по-специфично търсене, може да използвате последователност от команди на един команден ред. За разделител служи символът | (вертикална черта).
Някои от командите могат да се изпълнят и една след друга, но ще бъде изведена много ненужна информация. Употребата на последователност от команди на един ред може да се разглежда като скрипт и би спестила време.
Пример:
команда 1 | команда 2 | команда n
Всяка една команда се изпълнява и предава резултата си на следващата. Извежда се крайната стойност, след всички операции.
Намиране на конкретен активен процес
Пример за последователност от команди е употребата на ps aux, заедно с grep.
При изпълнение на ps aux се извеждат всички процеси и ресурсите, които използват. Ако се нуждаем от по-специфично търсене, а именно процесът, отговарящ за уеб сървъра, е необходимо да направим комбинация с grep.
Синтаксис:
ps aux | grep httpd
Извеждане на последните 10 резултата от файл по специфично търсене
Да разгледаме употребата на grep, в по-комплициран пример. Необходимо е да потърсим във файл error_log последните 10 резултата, които съдържат низовете ModSecurity и user. Това би изглеждало като сложна комбинация от команди, но разгледани индивидуално, те съвсем не са плашещи.
Синтаксис:
cat /etc/httpd/logs/error_log | grep ModSecurity | grep user | tail -10
С cat се достъпва файлът error_log. Следва grep команда за откриване на всички редове, в които се съдържа “ModSecurity“. Откритите съвпадения се подават на още една команда grep филтрация, по низ “user”. Команда tail служи, за да върне само последните 10 реда от всички съвпадения.
Grep в комбинация с find
Има случаи, в които за последователност от операции не се използва символа |. Например команда find изисква въвеждането на -exec, за да се продължи с изпълнение на допълнителна команда. В следващия пример са комбинирани find и grep.
find . -type f -name "*.php" -exec grep -li "FilesMan" {} \;
Тази група от команди, първо, намира всички файлове с разширение .php. След това извежда списък с всички редове, които съдържат низ “FilesMan”.
Надяваме се с тази статия за командата greb и практични примери за нейното приложение, да сме Ви полезни!