Как найти строку в файле linux
Перейти к содержимому

Как найти строку в файле linux

  • автор:

Команда Grep в Linux (поиск текста в файлах)

Команда grep означает «печать глобального регулярного выражения», и это одна из самых мощных и часто используемых команд в Linux.

grep ищет в одном или нескольких входных файлах строки, соответствующие заданному шаблону, и записывает каждую соответствующую строку в стандартный вывод. Если файлы не указаны, grep читает из стандартного ввода, который обычно является выводом другой команды.

В этой статье мы покажем вам, как использовать команду grep на практических примерах и подробных объяснениях наиболее распространенных опций GNU grep .

Командный синтаксис grep

Синтаксис команды grep следующий:

Пункты в квадратных скобках необязательны.

  • OPTIONS — Ноль или более вариантов. Grep включает ряд опций , управляющих его поведением.
  • PATTERN — Шаблон поиска.
  • FILE — Ноль или более имен входных файлов.

Чтобы иметь возможность искать файл, пользователь, выполняющий команду, должен иметь доступ для чтения к файлу.

Искать строку в файлах

Наиболее простое использование команды grep — поиск строки (текста) в файле.

Например, чтобы отобразить все строки, содержащие строку bash из файла /etc/passwd , вы должны выполнить следующую команду:

Результат должен выглядеть примерно так:

Если в строке есть пробелы, вам нужно заключить ее в одинарные или двойные кавычки:

Инвертировать соответствие (исключить)

Чтобы отобразить строки, не соответствующие шаблону, используйте параметр -v (или —invert-match ).

Например, чтобы распечатать строки, не содержащие строковый nologin вы должны использовать:

Использование Grep для фильтрации вывода команды

Вывод команды может быть отфильтрован с помощью grep через конвейер, и на терминал будут напечатаны только строки, соответствующие заданному шаблону.

Например, чтобы узнать, какие процессы выполняются в вашей системе как пользовательские www-data вы можете использовать следующую команду ps :

Вы также можете объединить несколько каналов по команде. Как вы можете видеть в выходных данных выше, также есть строка, содержащая процесс grep . Если вы не хотите, чтобы эта строка отображалась, передайте результат другому экземпляру grep как показано ниже.

Рекурсивный поиск

Для рекурсивного поиска шаблона вызовите grep с параметром -r (или —recursive ). Когда используется этот параметр, grep будет искать все файлы в указанном каталоге, пропуская символические ссылки, которые встречаются рекурсивно.

Чтобы следовать по всем символическим ссылкам , вместо -r используйте параметр -R (или —dereference-recursive ).

Вот пример, показывающий, как искать строку linuxize.com во всех файлах внутри каталога /etc :

Вывод будет включать совпадающие строки с префиксом полного пути к файлу:

Если вы используете опцию -R , grep будет следовать по всем символическим ссылкам:

Обратите внимание на последнюю строку вывода ниже. Эта строка не печатается, когда grep вызывается с -r потому что файлы внутри каталога с sites-enabled Nginx являются символическими ссылками на файлы конфигурации внутри каталога с sites-available .

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

Чтобы подавить вывод grep по умолчанию и вывести только имена файлов, содержащих совпадающий шаблон, используйте параметр -l (или —files-with-matches ).

Приведенная ниже команда выполняет поиск по всем файлам, заканчивающимся на .conf в текущем рабочем каталоге и выводит только имена файлов, содержащих строку linuxize.com :

Результат будет выглядеть примерно так:

Параметр -l обычно используется в сочетании с рекурсивным параметром -R :

Поиск без учета регистра

По умолчанию grep чувствителен к регистру. Это означает, что символы верхнего и нижнего регистра рассматриваются как разные.

Чтобы игнорировать регистр при поиске, вызовите grep с параметром -i (или —ignore-case ).

Например, при поиске Zebra без какой-либо опции следующая команда не покажет никаких результатов, т.е. есть совпадающие строки:

Но если вы выполните поиск без учета регистра с использованием параметра -i , он будет соответствовать как заглавным, так и строчным буквам:

Указание «Зебра» будет соответствовать «зебре», «ZEbrA» или любой другой комбинации букв верхнего и нижнего регистра для этой строки.

Искать полные слова

При поиске строки grep отобразит все строки, в которых строка встроена в строки большего размера.

Например, если вы ищете «gnu», все строки, в которых «gnu» встроено в слова большего размера, такие как «cygnus» или «magnum», будут найдены:

Чтобы вернуть только те строки, в которых указанная строка представляет собой целое слово (заключенное в символы, отличные от слов), используйте параметр -w (или —word-regexp ).

Если вы запустите ту же команду, что и выше, включая параметр -w , команда grep вернет только те строки, где gnu включен как отдельное слово.

Показать номера строк

Параметр -n (или —line-number ) указывает grep показывать номер строки, содержащей строку, соответствующую шаблону. Когда используется эта опция, grep выводит совпадения на стандартный вывод с префиксом номера строки.

Например, чтобы отобразить строки из файла /etc/services содержащие строку bash префиксом совпадающего номера строки, вы можете использовать следующую команду:

Результат ниже показывает нам, что совпадения находятся в строках 10423 и 10424.

Подсчет совпадений

Чтобы вывести количество совпадающих строк в стандартный вывод, используйте параметр -c (или —count ).

В приведенном ниже примере мы подсчитываем количество учетных записей, в которых в качестве оболочки используется /usr/bin/zsh .

Бесшумный режим

-q (или —quiet ) указывает grep работать в тихом режиме, чтобы ничего не отображать на стандартном выводе. Если совпадение найдено, команда завершает работу со статусом 0 . Это полезно при использовании grep в сценариях оболочки, где вы хотите проверить, содержит ли файл строку, и выполнить определенное действие в зависимости от результата.

Вот пример использования grep в тихом режиме в качестве тестовой команды в операторе if :

Основное регулярное выражение

GNU Grep имеет три набора функций регулярных выражений : базовый, расширенный и Perl-совместимый.

По умолчанию grep интерпретирует шаблон как базовое регулярное выражение, где все символы, кроме метасимволов, на самом деле являются регулярными выражениями, которые соответствуют друг другу.

Ниже приведен список наиболее часто используемых метасимволов:

Используйте символ ^ (каретка) для сопоставления выражения в начале строки. В следующем примере строка kangaroo будет соответствовать только в том случае, если она встречается в самом начале строки.

Используйте символ $ (доллар), чтобы найти выражение в конце строки. В следующем примере строка kangaroo будет соответствовать только в том случае, если она встречается в самом конце строки.

Используйте расширение . (точка) символ, соответствующий любому одиночному символу. Например, чтобы сопоставить все, что начинается с kan затем имеет два символа и заканчивается строкой roo , вы можете использовать следующий шаблон:

Используйте [ ] (скобки) для соответствия любому одиночному символу, заключенному в квадратные скобки. Например, найдите строки, содержащие accept или « accent , вы можете использовать следующий шаблон:

Используйте [^ ] для соответствия любому одиночному символу, не заключенному в квадратные скобки. Следующий шаблон будет соответствовать любой комбинации строк, содержащих co(any_letter_except_l)a , например coca , cobalt и т. Д., Но не будет соответствовать строкам, содержащим cola ,

Чтобы избежать специального значения следующего символа, используйте символ (обратная косая черта).

Расширенные регулярные выражения

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

Сопоставьте и извлеките все адреса электронной почты из данного файла:

Сопоставьте и извлеките все действительные IP-адреса из данного файла:

Параметр -o используется для печати только соответствующей строки.

Поиск нескольких строк (шаблонов)

Два или более шаблонов поиска можно объединить с помощью оператора ИЛИ | .

По умолчанию grep интерпретирует шаблон как базовое регулярное выражение, в котором метасимволы, такие как | теряют свое особое значение, и необходимо использовать их версии с обратной косой чертой.

В приведенном ниже примере мы ищем все вхождения слов fatal , error и critical в файле ошибок журнала Nginx :

Если вы используете опцию расширенного регулярного выражения -E , то оператор | не следует экранировать, как показано ниже:

Строки печати перед матчем

Чтобы напечатать определенное количество строк перед совпадающими строками, используйте параметр -B (или —before-context ).

Например, чтобы отобразить пять строк ведущего контекста перед совпадающими строками, вы должны использовать следующую команду:

Печатать строки после матча

Чтобы напечатать определенное количество строк после совпадающих строк, используйте параметр -A (или —after-context ).

Например, чтобы отобразить пять строк конечного контекста после совпадающих строк, вы должны использовать следующую команду:

Выводы

Команда grep позволяет искать шаблон внутри файлов. Если совпадение найдено, grep печатает строки, содержащие указанный шаблон.

Подробнее о Grep можно узнать на странице руководства пользователя Grep .

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Linux Command: grep

Type: Linux search command.

Introduction

grep” stands for “global/regular expression/print”.

grep is a command used to search text for lines that match the given pattern in input files and print out the matching lines.

There are no limits on input lines but available memory.

Basic Usage

A general usage:

Options

There are several types of options.

Generic Program Information

–help:
print the help text.

-V, –version:
print version information.

Matching control.

-e PATTERN, –regexp=PATTERN:
use PATTERN for matching.

-f FILE, –file=FILE:
obtain patterns from FILE, one per line.

-i, -y, –ignore-case:
ignore case distinctions.

-v, –invert-match:
select non-matching lines.

-w, –word-regexp:
force PATTERN to match only whole words.

-x, –line-regexp:
force PATTERN to match only whole lines.

General Output Control

-c, –count:
print only a count of matching lines per FILE.

–color[=WHEN], –colour[=WHEN]:
use markers to highlight the matching strings; WHEN is ‘always’, ‘never’ or ‘auto’.

-L, –files-without-match:
print only names of FILEs containing no match.

-l, –files-with-match:
print only names of FILEs containing matches.

-m NUM, –max-count=NUM:
stop after NUM matches.

-o, –only-matching:
show only the part of a line matching PATTERN.

-q, –quiet, –silent:
suppress all normal output.

-s, –no-messages:
suppress error messages.

Output Line Prefix Control

-b, –byte-offset:
print the byte offset with output lines.

-H, –with-filename:
print the file name for each match.

-h, –no-filename:
suppress the file name prefix on output.

–label=LABEL:
use LABEL as the standard input file name prefix.

-n, –line-number:
print line number with output lines.

-T, –initial-tab:
make tabs line up (if needed).

-u, –unix-byte-offsets:
report offsets as if CRs were not there (MSDOS/Windows).

-Z, –null:
print 0 byte after FILE name.

Context Line Control

-A NUM, –after-context=NUM:
print NUM lines of training context.

-B NUM, –before-context=NUM:
print NUM lines of leading context.

-C NUM, -NUM, –context=NUM:
print NUM lines of output context.

File and Directory Selection

–binary-file=TYPE:
assume that binary files are TYPE; TYPE is ‘binary’, ‘text’ or ‘without-match’.

-a, –text:
equivalent to –binary-files=text.

-I:
equivalent to –binary-files=without-match.

-D ACTION, –devices-ACTION:
how to handle devices, FIFOs and sockets; ACTION is ‘read’ or ‘skip’.

-d ACTION, –directories=ACTION:
how to handle directories; ACTION is ‘read’, ‘recurse’ or ‘skip’.

–exclude=FILE_PATTERN:
skip files and directories matching FILE_PATTERN.

–include=FILE_PATTERN:
search only files that match FILE_PATTERN.

–exclude-from=FILE:
skip files matching any file pattern from FILE.

–exclude-dir=PATTERN:
directories that match PATTERN will be skipped.

-r, –recursive:
operand, read and process all files in that directory recursively for each directory. Like ‘–directories=recurse’.

-R, –dereference-recursive:
operand, read and process all files in that directory recursively, following all symbolic links for each directory.

Other Options

–line-buffered:
flush output on every line.

-U, –binary:
do not strip CR characters at EOL (MSDOS/Windows).

-z, –null-data:
a data line ends in 0 byte, not newline.

grep Programs

There are 4 major variants of grep:

-G, –basic-regexp:
PATTERN is a basic regular expression (BRE)

-E, –extended-regexp:
PATTERN is an extended regular expression (ERE)

-F, –fixed-strings:
PATTERN is a set of newline-separated strings

-P, –perl-regexp:
PATTERN is a Perl regular expression

In addition, two variant programs egrep and fgrep are available. egrep is the same as ‘grep -E’. fgrep is the same as ‘grep -F’.

Regular Expressions

A regular expression is a pattern that describes a set of strings.

Fundamental Structure

’.’
matches any single character.

’?’
the preceding item is optional and will be matched at most once.

‘*‘
the preceding item will be matched zero or more times.

’+’
the preceding item will be matched one or more times.


the preceding item is matched exactly n times.


the preceding item is matched n or more times.

’<,m>’
the preceding item is matched at most m times.


the preceding item is matched at least n times, but not more than m times.

The empty regular expression matches the empty string.
Two regular expressions may be concatenated.
Two regular expressions may be joined by the infix operator ‘|’.

Character Classes and Bracket Expressions

A bracket expression is a list of character enclosed by ‘[’ and ‘]’.
It matches any single character in that list; if the first character of the list is the caret ‘^’, then it matches any character not in the list.

’[:alnum:]’
alphanumeric characters: ‘[:alpha:]’ and ‘[:digit:]’; in the ‘c’ locale and ASCII character encoding, this is the same as ‘[0-9A-Za-z]’.

’[:alpha:]’
alphabetic characters: ‘[:lower:]’ and ‘[:upper:]’; in the ‘c’ locale and ASCII character encoding, this is the same as ‘[A-Za-z]’.

’[:blank:]’
blank characters: space and tab.

’[:cntrl:]’
control character. In ASCII, these characters have octal codes 000 through 037, and 177 (DEL).

’[:graph:]’
graphical characters: ‘[:alnum:]’ and ‘[:punct:]’.

’[:lower:]’
lower-case letters.

’[:print:]’
printable characters: ‘[:alnum:]’, ‘[:punct:]’ and space.

’[:punct:]’
punctuation characters. In the ‘c’ locale and ASCII character encoding, this includes ! “ # $ % & ‘ ( ) * + , — . / : ; < = > ? @ [ \ ] ^ _ `

’[:space:]’
space characters: in the ‘c’ locale, this includes tab, newline, vertical tab, form feed, carriage return and space.

’[:upper:]’
upper-case letters.

’[:xdigit:]’
hexadecimal digits: 0-9 A-F a-f.

Backslash Character and Special Expressions

‘\b’
match the empty string at the edge of a word.

‘\B’
match the empty string provided it is not at the edge of a word.

’\<’
match the empty string at the beginning of word.

’\>’
match the empty string at the end of word.

‘\w’
match word constituent, it is a synonym for ‘[_[:alnum:]]’.

‘\W’
match non-word constituent, it is a synonym for ‘[^_[:alnum:]]’.

‘\s’
match whitespace, it is a synonym for ‘[[:space:]]’.

‘\S’
match non-whitespace, it is a synonym for ‘[^[:space:]]’.

Anchoring

The caret ‘^’ matches the beginning of a line.
The dollar sign ‘$’ matches the end of a line.

Extended Regular Expressions

’|’
alternation. Expression can be chosen between more than 2 choices by additional pip characters.

’<>’
specifies match repetition. The brace characters can specify the number of times that a match is repeated.

Examples

Use the GPL file in the common licenses directory as an example.

Basic Examples

The output of the result will be every line containing the pattern text:

The output of this result will be every line containing the word “license” (with any mixed cases):

The output of the result will be the lines that do NOT contain the word “the”:

The output of the result will be the matching lines including the line numbers:

Regular Expressions Examples

Only match “GNU” if it occurs at the beginning of a line:

Only match “and” if it occurs at the end of a line:

Match anything that has 2 characters and then the string “cept”:

Find the lines that contain “too” or “two”:

Find the pattern “.ode” but not match “code”:

Find lines that begin with a capital letter:

Find lines that contain an opening and closing parenthesis, with only letters and single spaces in between:

Find lines that begin with a capital letter and end with a period:

Extended Regular Expressions Examples

Find either “GPL” or “General Public License” in the text:

Find lines that match “copyright” and “right”:

Find lines that contain the string “free” plus one or more characters that are not whitespace (such as “freedom” and “free.”):

Find lines that contain any words that have between 16 and 20 characters:

How to Use Grep Command in Linux/Unix + Useful Examples

How to Use Grep Command in Linux/Unix + Useful Examples

Searching for files on a VPS might seem an easy task at first. However, it can quickly become overwhelming, especially if you have thousands of large log files to check or run a Linux operating system without a graphical interface.

That’s where the grep command comes in – it allows users to search for a string within the system easily.

In this tutorial, we will cover the basics of the grep command and provide some practical use-cases, from searching for multiple strings to performing the grep search recursively.

Understanding the grep Command Syntax

Grep, or global regular expression print, is one of the most versatile and useful Linux commands available.

It works by searching for text and strings that users define in a given file. In other words, grep enables users to search files for a particular pattern or word and see any lines that contain it.

For example, system administrators who handle hundreds of services and configuration files use grep to search for specific lines within those files.

To start using the grep command, connect to the VPS using SSH.

Linux users can just open the terminal.

The grep basic syntax when searching for a single file looks like this:

  • grep – the command instruction.
  • [options] – modifiers to the command.
  • pattern – the search query to be found.
  • [FILE] – the file in which the command will be searching.

A visual example would look like this:

The basic syntax for the grep command. Users can specify flags, search string, and file names.

If you need more information about the command, check out the comprehensive documentation by executing the following command:

While the grep command offers a lot of options, the most important and commonly used flags are these:

  • -A – print lines before the matched string.
  • -B – print lines after the matched string.
  • -C – print lines before and after the matched string.

ABC flags help you add some context to your searches. For example, when using grep in a configuration file, lines before or after your preferred string might provide more useful information about the search.

ABC regular expression pattern for the grep command

In the command example above, we used the regular grep utility, which only showed the Password line. Then, we combined the A1 flag to print out one additional line before the matched Password string. A similar process was done with B1 and C1 flags.

To customize your search even further, add the following flags:

  • -i – case insensitive search. If users, for example, search for a string car, it will show the same results as CAR.
  • -w – searches for full words only, ignoring your string if it’s a part of another word.
  • -c – will show the number of matches with the searched pattern.
  • -r – enables recursive search in the current directory.
  • -n – search for lines and receive only the matched numbers of the text lines.
  • -v – this option shows the lines that do not match the specified pattern.

Practical Examples of the grep Command Line

Check out these useful examples of the grep command to understand it better.

How to Search for a Word in a File

One popular use case for grep is searching for a particular word inside a text file.

To do so, just type the following command:

  • query – the word you’re looking for.
  • file – the file in which you’re looking for the query.

In our case, we’re looking for the word VPS in the sample file called Hostinger.txt:

The output highlights the lines that match this query:

Searching for a word in a specified file with grep. Users only need to specify the search query and the file name.

How to Find a Keyword Match in Multiple Files

If you need to search through several files, refer to this syntax:

  • query – the word you’re looking for.
  • file1, file2, file3 – files in which you’re looking for the query.

In our example, we are looking for the word VPS in these three files: Hostinger.txt, VPS.txt, SharedHosting.txt.

Searching for keywords in multiple files. Matched lines highlight the search query and the matching files

It is also possible to search for all the files in a given directory by applying the following command.

How to Search for Multiple Keywords

So far, we’ve covered grep commands for matching a single keyword. However, grep also supports multiple queries in a single command.

Here are four different ways to search for multiple keywords:

Searching for multiple keywords at the same time. Grep displays and highlights the output data for the user.

Any of these commands work similarly – you can decide which one to use according to your preference.

How to Find Matches That Start or End With Query

Grep searches can also look for strings starting or ending with a user-specified query. To match the start of a line, use the ^ regular expression.

On the other hand, to match the end of a line, use the $ regular expression:

Users can also combine these two regular expressions and search for all the lines that contain both the start and end query.

For example, we will be searching for the lines that start with H and end with o:

A complex grep search that includes the use of special characters. The grep command lists out the lines that start and end with our specified characters.

As seen above, lines that have the Hello string match our search query.

How to Display a Line Number with grep Command Search

Linux configuration files are usually lengthy, ranging from a few hundred to a few thousand lines. For this reason, it can be very hard to track lines position.

Luckily, grep can help. With the use of the -n flag, users will be able to see line numbers as well as their search query.

Grep search with the -n flag which shows the entire line and line number

In our case, we used grep to search for line string inside the Grep.txt file. The green numbers on the left display line numbers on our file.

How to Use Invert grep Search

Users can invert the grep expression by using the -v flag. This is very useful for printing out non-matching lines. The following example shows how the command displays output lines that are not matching the VPS search query.

We have also combined the regular expressions and used the -n flag to see the matching line numbers.

How to Perform the grep Search Recursively

Recursive grep is useful for searching between all the lines in sub-directories and files inside the current working directory. For this example, we have created a Grep directory with VPS and SharedHosting directories inside it and will look for the VPS query.

Recursive grep search for the specified file

How to Export the grep Output to a File

If you need to save the grep command output, you can do so in a separate file. The easiest way is by referring to the following command:

Keep in mind that you do not need to create the file before, as running the above command will create it automatically. This is what it would look like in the command line:

Printing out grep command pattern matches to a txt file

As seen from the example above, we have also used the cat to print out the contents of the newly created file.

Conclusion

The grep command makes searching between hundreds of files and directories easy. With its vast collection of different flags, you will be able to find specific lines quickly.

In this tutorial, we’ve covered the syntax of the grep command and learned how to:

  • Search for a word in a file.
  • Find a keyword match in multiple files.
  • Search for multiple keywords.
  • Find matches that start or end with your query.
  • Display a line number.
  • Use inverted grep search.
  • Perform recursive search.
  • Export grep output contents to a file.

We’ve also provided some popular flags you can use when trying out the grep command. If you have any insights or questions, let us know in the comments section below.

Learn More Linux Commands for Reading Files

Author

Ignas takes great satisfaction in helping people tackle even the most complex technical issues. His current goal is to write easy-to-follow articles so that these issues will not happen at all. During his free time, Ignas likes to play video games and fix up things around his house.

Команда grep в Linux

Иногда может понадобится найти файл, в котором содержится определённая строка или найти строку в файле, где есть нужное слово. В Linux для этого существует несколько утилит, одна из самых используемых это grep. С её помощью можно искать не только строки в файлах, но и фильтровать вывод команд, и много чего ещё.

В этой инструкции мы рассмотрим что такое команда grep Linux, подробно разберём синтаксис и возможные опции grep, а также приведём несколько примеров работы с этой утилитой.

Что такое grep?

Название команды grep расшифровывается как «search globally for lines matching the regular expression, and print them». Это одна из самых востребованных команд в терминале Linux, которая входит в состав проекта GNU. До того как появился проект GNU, существовала утилита предшественник grep, тем же названием, которая была разработана в 1973 году Кеном Томпсоном для поиска файлов по содержимому в Unix. А потом уже была разработана свободная утилита с той же функциональностью в рамках GNU.

Grep дает очень много возможностей для фильтрации текста. Вы можете выбирать нужные строки из текстовых файлов, отфильтровать вывод команд, и даже искать файлы в файловой системе, которые содержат определённые строки. Утилита очень популярна, потому что она уже предустановлена прочти во всех дистрибутивах.

Синтаксис grep

Синтаксис команды выглядит следующим образом:

$ grep [опции] шаблон [/путь/к/файлу/или/папке. ]

$ команда | grep [опции] шаблон

  • Опции — это дополнительные параметры, с помощью которых указываются различные настройки поиска и вывода, например количество строк или режим инверсии.
  • Шаблон — это любая строка или регулярное выражение, по которому будет выполняться поиск.
  • Имя файла или папки — это то место, где будет выполняться поиск. Как вы увидите дальше, grep позволяет искать в нескольких файлах и даже в каталоге, используя рекурсивный режим.

Возможность фильтровать стандартный вывод пригодится, например, когда нужно выбрать только ошибки из логов или отфильтровать только необходимую информацию из вывода какой-либо другой утилиты.

Опции

Давайте рассмотрим самые основные опции утилиты, которые помогут более эффективно выполнять поиск текста в файлах grep:

  • -E, —extended-regexp — включить расширенный режим регулярных выражений (ERE);
  • -F, —fixed-strings — рассматривать шаблон поиска как обычную строку, а не регулярное выражение;
  • -G, —basic-regexp — интерпретировать шаблон поиска как базовое регулярное выражение (BRE);
  • -P, —perl-regexp — рассматривать шаблон поиска как регулярное выражение Perl;
  • -e, —regexp — альтернативный способ указать шаблон поиска, опцию можно использовать несколько раз, что позволяет указать несколько шаблонов для поиска файлов, содержащих один из них;
  • -f, —file — читать шаблон поиска из файла;
  • -i, —ignore-case — не учитывать регистр символов;
  • -v, —invert-match — вывести только те строки, в которых шаблон поиска не найден;
  • -w, —word-regexp — искать шаблон как слово, отделенное пробелами или другими знаками препинания;
  • -x, —line-regexp — искать шаблон как целую строку, от начала и до символа перевода строки;
  • -c — вывести количество найденных строк;
  • —color — включить цветной режим, доступные значения: never, always и auto;
  • -L, —files-without-match — выводить только имена файлов, будут выведены все файлы в которых выполняется поиск;
  • -l, —files-with-match — аналогично предыдущему, но будут выведены только файлы, в которых есть хотя бы одно вхождение;
  • -m, —max-count — остановить поиск после того как будет найдено указанное количество строк;
  • -o, —only-matching — отображать только совпавшую часть, вместо отображения всей строки;
  • -h, —no-filename — не выводить имя файла;
  • -q, —quiet — не выводить ничего;
  • -s, —no-messages — не выводить ошибки чтения файлов;
  • -A, —after-content — показать вхождение и n строк после него;
  • -B, —before-content — показать вхождение и n строк после него;
  • -C — показать n строк до и после вхождения;
  • -a, —text — обрабатывать двоичные файлы как текст;
  • —exclude — пропустить файлы имена которых соответствуют регулярному выражению;
  • —exclude-dir — пропустить все файлы в указанной директории;
  • -I — пропускать двоичные файлы;
  • —include — искать только в файлах, имена которых соответствуют регулярному выражению;
  • -r — рекурсивный поиск по всем подпапкам;
  • -R — рекурсивный поиск включая ссылки;

Все самые основные опции рассмотрели, теперь давайте перейдём к примерам работы команды grep Linux.

Примеры использования grep

Давайте перейдём к практике. Сначала рассмотрим несколько основных примеров поиска внутри файлов Linux с помощью grep.

1. Поиск текста в файле

В первом примере мы будем искать информацию о пользователе root в файле со списком пользователей Linux /etc/passwd. Для этого выполните следующую команду:

grep root /etc/passwd

В результате вы получите что-то вроде этого:

С помощью опции -i можно указать, что регистр символов учитывать не нужно. Например, давайте найдём все строки содержащие вхождение слова time в том же файле:

grep -i «time» /etc/passwd

В этом случае Time, time, TIME и другие вариации слова будут считаться эквивалентными. Ещё, вы можете указать несколько условий для поиска, используя опцию -e. Например:

grep -e «root» -e «daemon» /etc/passwd

C помощью опции -n можно выводить номер строки, в которой найдено вхождение, например:

grep -n ‘root’ /etc/passwd

Это всё хорошо работает пока ваш поисковый запрос не содержит специальных символов. Например, если вы попытаетесь найти все строки, которые содержат символ «[» в файле /etc/grub/00_header, то получите ошибку, что это регулярное выражение не верно. Для того чтобы этого избежать, нужно явно указать, что вы хотите искать строку с помощью опции -F:

grep -F «[» /etc/grub.d/00_header

Теперь вы знаете как выполняется поиск текста файлах grep.

2. Фильтрация вывода команды

Для того чтобы отфильтровать вывод другой команды с помощью grep достаточно перенаправить его используя оператор |. А файл для самого grep указывать не надо. Например, для того чтобы найти все процессы gnome можно использовать такую команду:

ps aux | grep «gnome»

В остальном всё работает аналогично.

3. Базовые регулярные выражения

Утилита grep поддерживает несколько видов регулярных выражений. Это базовые регулярные выражения (BRE), которые используются по умолчанию и расширенные (ERE). Базовые регулярные выражение поддерживает набор символов, позволяющих описать каждый определённый символ в строке. Это: ., *, [], [^], ^ и $. Например, вы можете найти строки, которые начитаются на букву r:

grep «^r» /etc/passwd

Или же строки, которые содержат большие буквы:

grep «[A-Z]» /etc/passwd

А так можно найти все строки, которые заканчиваются на ready в файле /var/log/dmesg:

grep «ready$» /var/log/dmesg

Но используя базовый синтаксис вы не можете указать точное количество этих символов.

4. Расширенные регулярные выражения

В дополнение ко всем символам из базового синтаксиса, в расширенном синтаксисе поддерживаются также такие символы:

  • + — одно или больше повторений предыдущего символа;
  • ? — ноль или одно повторение предыдущего символа;
  • — повторение предыдущего символа от n до m раз;
  • | — позволяет объединять несколько паттернов.

Для активации расширенного синтаксиса нужно использовать опцию -E. Например, вместо использования опции -e, можно объединить несколько слов для поиска вот так:

grep -E «root|daemon» /etc/passwd

Вообще, регулярные выражения grep — это очень обширная тема, в этой статье я лишь показал несколько примеров. Как вы увидели, поиск текста в файлах grep становиться ещё эффективнее. Но на полное объяснение этой темы нужна целая статья, поэтому пока пропустим её и пойдем дальше.

5. Вывод контекста

Иногда бывает очень полезно вывести не только саму строку со вхождением, но и строки до и после неё. Например, мы хотим выбрать все ошибки из лог-файла, но знаем, что в следующей строчке после ошибки может содержаться полезная информация, тогда с помощью grep отобразим несколько строк. Ошибки будем искать в /var/log/dmesg по шаблону «Error»:

grep -A4 «Error» /var/log/dmesg

Выведет строку с вхождением и 4 строчки после неё:

grep -B4 «Error» /var/log/dmesg

Эта команда выведет строку со вхождением и 4 строчки до неё. А следующая выведет по две строки с верху и снизу от вхождения.

grep -C2 «Error» /var/log/dmesg

6. Рекурсивный поиск в grep

До этого мы рассматривали поиск в определённом файле или выводе команд. Но grep также может выполнить поиск текста в нескольких файлах, размещённых в одном каталоге или подкаталогах. Для этого нужно использовать опцию -r. Например, давайте найдём все файлы, которые содержат строку Kernel в папке /var/log:

grep -r «Kernel» /var/log

Папка с вашими файлами может содержать двоичные файлы, в которых поиск выполнять обычно не надо. Для того чтобы их пропускать используйте опцию -I:

grep -rI «Kernel» /var/log

Некоторые файлы доступны только суперпользователю и для того чтобы выполнять по ним поиск вам нужно запускать grep с помощью sudo. Или же вы можете просто скрыть сообщения об ошибках чтения и пропускать такие файлы с помощью опции -s:

grep -rIs «Kernel» /var/log

7. Выбор файлов для поиска

С помощью опций —include и —exclude вы можете фильтровать файлы, которые будут принимать участие в поиске. Например, для того чтобы выполнить поиск только по файлам с расширением .log в папке /var/log используйте такую команду:

grep -r —include=»*.log» «Kernel» /var/log

А для того чтобы исключить все файлы с расширением .journal надо использовать опцию —exclude:

grep -r —exclude=»*.journal» «Kernel» /var/log

8. Поиск слов в grep

Когда вы ищете строку abc, grep будет выводить также kbabc, abc123, aafrabc32 и тому подобные комбинации. Вы можете заставить утилиту искать по содержимому файлов в Linux строки, которые включают только искомые слова полностью с помощью опции -w. Например:

grep -w «root» /etc/passwd

9. Количество строк

Утилита grep может сообщить, сколько строк с определенным текстом было найдено файле. Для этого используется опция -c (счетчик). Например:

grep -c ‘Kernel’ /var/log/dmesg

10. Инвертированный поиск

Команда grep Linux может быть использована для поиска строк, которые не содержат указанное слово. Например, так можно вывести только те строки, которые не содержат слово nologin:

grep -v nologin /etc/passwd

11. Вывод имен файлов

Вы можете указать grep выводить только имена файлов, в которых было хотя бы одно вхождение с помощью опции -l. Например, следующая команда выведет все имена файлов из каталога /var/log, при поиске по содержимому которых было обнаружено вхождение Kernel:

grep -lr ‘Kernel’ /var/log/

12. Цветной вывод

По умолчанию grep не будет подсвечивать совпадения цветом. Но в большинстве дистрибутивов прописан алиас для grep, который это включает. Однако, когда вы используйте команду c sudo это работать не будет. Для включения подсветки вручную используйте опцию —color со значением always:

sudo grep —color=always root /etc/passwd

Выводы

Вот и всё. Теперь вы знаете что представляет из себя команда grep Linux, а также как ею пользоваться для поиска файлов и фильтрации вывода команд. При правильном применении эта утилита станет мощным инструментом в ваших руках. Если у вас остались вопросы, пишите в комментариях!

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *