Вам необходимо освоить команду grep в Linux.
Это часть продолжающейся серии 15 примеров, в которой будут представлены 15 подробных примеров для определенной команды или функциональности. Ранее мы рассмотрели 15 практических примеров для команды Linux find, истории командной строки Linux и команды mysqladmin.
В этой статье мы рассмотрим 15 практических примеров команды Linux grep, которые будут очень полезны как новичкам, так и экспертам.
Сначала создайте следующий файл demo_file, который будет использоваться в примерах ниже для демонстрации команды grep.
$ cat demo_file
THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.
this line is the 1st lower case line in this file.
This Line Has All Its First Character Of The Word With Upper Case.
Two lines above this line is empty.
And this is the last line.
1. Поиск заданной строки в одном файле
Основное использование команды grep заключается в поиске определенной строки в указанном файле, как показано ниже.
Syntax:
grep "literal_string" filename
$ grep "this" demo_file
this line is the 1st lower case line in this file.
Two lines above this line is empty.
And this is the last line.
2. Проверка заданной строки в нескольких файлах.
Syntax:
grep "string" FILE_PATTERN
Это также базовое использование команды grep. В данном примере давайте скопируем файл demo_file в файл demo_file1. Вывод grep также будет включать имя файла перед строкой, которая соответствует определенному шаблону, как показано ниже. Когда оболочка Linux видит символ meta, она выполняет расширение и выдает все файлы в качестве входных данных для grep.
$ cp demo_file demo_file1
$ grep "this" demo_*
demo_file:this line is the 1st lower case line in this file.
demo_file:Two lines above this line is empty.
demo_file:And this is the last line.
demo_file1:this line is the 1st lower case line in this file.
demo_file1:Two lines above this line is empty.
demo_file1:And this is the last line.
3. Поиск без учета регистра с помощью grep -i
Syntax:
grep -i "string" FILE
Это также базовое использование grep. Он ищет заданную строку/шаблон без учета регистра. Поэтому все слова, такие как «the», «THE» и «The», он ищет без учета регистра, как показано ниже.
$ grep -i "the" demo_file
THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.
this line is the 1st lower case line in this file.
This Line Has All Its First Character Of The Word With Upper Case.
And this is the last line.
4. Сопоставление регулярных выражений в файлах
Syntax:
grep "REGEX" filename
Это очень мощная функция, если вы можете эффективно использовать регулярные выражения. В следующем примере выполняется поиск всех шаблонов, начинающихся со слова «lines» и заканчивающихся словом «empty» с любыми промежутками между ними. т.е. поиск «lines[anything in-between]empty» в файле demo_file.
$ grep "lines.*empty" demo_file
Two lines above this line is empty.
Из документации по grep: За регулярным выражением может следовать один из нескольких операторов повторения:
? Предшествующий элемент необязателен и будет сопоставлен не более одного раза.
- Предшествующий элемент будет повторен ноль или более раз.
- Предыдущий элемент будет встречен один или более раз.{n} Предшествующий элемент встречается ровно n раз.{n,} Предшествующий элемент встречается n или более раз.{,m} Предшествующий элемент встречается не более m раз.{n,m} Предшествующий элемент встречается не менее n раз, но не более m раз.
5. Проверка полных слов, а не подстрок с помощью grep -w
Если вы хотите найти слово и избежать поиска подстрок, используйте опцию -w. Обычный поиск покажет все строки.
В следующем примере обычный grep ищет слово «is». Когда вы ищете «is», без каких-либо опций он покажет «is», «his», «this» и все, что имеет подстроку «is».
$ grep -i "is" demo_file
THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.
this line is the 1st lower case line in this file.
This Line Has All Its First Character Of The Word With Upper Case.
Two lines above this line is empty.
And this is the last line.
В следующем примере WORD grep ищет только слово «is». Обратите внимание, что в этом выводе нет строки «This Line Has All Its First Character Of The Word With Upper Case», хотя слово «is» присутствует в строке «This», так как поиск ведется только для слова «is», а не для «this».
$ grep -iw "is" demo_file
THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.
this line is the 1st lower case line in this file.
Two lines above this line is empty.
And this is the last line.
6. Отображение строк до, после и вокруг совпадения с помощью grep -A, -B и -C
При выполнении grep в огромном файле может быть полезно увидеть несколько строк после совпадения. Вам будет удобно, если grep сможет показать вам не только совпадающие строки, но и строки после/до/за совпадением.
Для примера создайте следующий файл demo_text.
$ cat demo_text
4. Vim Word Navigation
You may want to do several navigation in relation to the words, such as:
* e - go to the end of the current word.
* E - go to the end of the current WORD.
* b - go to the previous (before) word.
* B - go to the previous (before) WORD.
* w - go to the next word.
* W - go to the next WORD.
WORD - WORD consists of a sequence of non-blank characters, separated with white space.
word - word consists of a sequence of letters, digits and underscores.
Example to show the difference between WORD and word
* 192.168.1.1 - single WORD
* 192.168.1.1 - seven words.
6.1 Отображение N строк после совпадения
-A — это опция, которая печатает указанные N строк после совпадения, как показано ниже.
Syntax:
grep -A <N> "string" FILENAME
В следующем примере печатается совпавшая строка, а также 3 строки после нее.
$ grep -A 3 -i "example" demo_text
Example to show the difference between WORD and word
* 192.168.1.1 - single WORD
* 192.168.1.1 - seven words.
6.2 Display N lines before match
-B — это опция, которая печатает указанные N строк до совпадения.
Syntax:
grep -B <N> "string" FILENAME
Если у вас была опция показать N строк после матча, у вас есть опция -B для обратного.
$ grep -B 2 "single WORD" demo_text
Example to show the difference between WORD and word
* 192.168.1.1 - single WORD
6.3 Отображение N строк после совпадения
-C — это опция, которая печатает указанные N строк перед матчем. В некоторых случаях вы можете захотеть, чтобы матч отображался с обеих сторон. Эта опция показывает N строк с обеих сторон (до и после) совпадения.
$ grep -C 2 "Example" demo_text
word - word consists of a sequence of letters, digits and underscores.
Example to show the difference between WORD and word
* 192.168.1.1 - single WORD
7. Выделение поиска с помощью GREP_OPTIONS
Поскольку grep распечатывает строки из файла по заданному вами шаблону/строке, если вы хотите, чтобы он выделил, какая часть совпадает со строкой, то вам нужно следовать следующему пути.
Когда вы выполните следующий экспорт, вы получите подсветку совпадающих поисковых запросов. В следующем примере, если установить переменную окружения GREP_OPTIONS, как показано ниже, будет выделено все это.
$ export GREP_OPTIONS='--color=auto' GREP_COLOR='100;8'
$ grep this demo_file
this line is the 1st lower case line in this file.
Two lines above this line is empty.
And this is the last line.
8. Рекурсивный поиск во всех файлах с помощью grep -r
Когда вы хотите найти все файлы в текущем каталоге и его подкаталогах. Для этого необходимо использовать параметр -r. В следующем примере строка «ramesh» будет искаться во всех файлах текущего каталога и всех его подкаталогов.
$ grep -r "ramesh" *
9. Инвертируйте совпадение с помощью grep -v
У вас были различные опции, чтобы показать совпадающие строки, показать строки до совпадения, показать строки после совпадения и выделить совпадение. Определенно, вам также понадобится опция -v для инвертирования совпадения.
Когда вы хотите отобразить строки, которые не соответствуют заданной строке/шаблону, используйте опцию -v, как показано ниже. В этом примере будут показаны все строки, которые не соответствуют слову «go».
$ grep -v "go" demo_text
4. Vim Word Navigation
You may want to do several navigation in relation to the words, such as:
WORD - WORD consists of a sequence of non-blank characters, separated with white space.
word - word consists of a sequence of letters, digits and underscores.
Example to show the difference between WORD and word
* 192.168.1.1 - single WORD
* 192.168.1.1 - seven words.
10. Отображение строк, не соответствующих заданному шаблону.
Syntax:
grep -v -e "pattern" -e "pattern"
$ cat test-file.txt
a
b
c
d
$ grep -v -e "a" -e "b" -e "c" test-file.txt
d
11. Подсчет количества совпадений с помощью grep -c
Когда вы хотите подсчитать, сколько строк соответствует заданному шаблону/строке, используйте опцию -c.
Syntax:
grep -c "pattern" filename
$ grep -c "go" demo_text
6
Когда вы хотите узнать, сколько строк соответствует шаблону
$ grep -c this demo_file
3
Когда вы хотите узнать, сколько строк не соответствует шаблону
$ grep -v -c this demo_file
4
12. Отображение только тех имен файлов, которые соответствуют заданному шаблону с помощью grep -l
Если вы хотите, чтобы grep показывал только те имена файлов, которые соответствуют заданному шаблону, используйте опцию -l (строчная буква L).
Когда вы передаете grep несколько файлов в качестве входных данных, он отображает имена файлов, которые содержат текст, соответствующий шаблону, что будет очень удобно, когда вы пытаетесь найти некоторые заметки во всей структуре каталогов.
$ grep -l this demo_*
demo_file
demo_file1
13. Показывать только совпавшую строку
По умолчанию grep показывает строку, которая соответствует заданному шаблону/строке, но если вы хотите, чтобы grep показывал только совпадающую строку шаблона, используйте опцию -o.
Это может быть не так полезно, когда вы задаете строку прямо. Но она становится очень полезной, когда вы задаете шаблон regex и пытаетесь увидеть, чему он соответствует.
$ grep -o "is.*line" demo_file
is line — 1-я строка в нижнем регистре
это строка
это последняя строка
14. Показать позицию совпадения в строке
Если вы хотите, чтобы grep показывал позицию совпадения с шаблоном в файле, используйте следующие опции
Syntax:
grep -o -b "pattern" file
$ cat temp-file.txt
12345
12345
$ grep -o -b "3" temp-file.txt
2:3
8:3
Примечание: Вывод команды grep выше — это не позиция в строке, это смещение байтов всего файла.
15. Показывать номер строки при выводе результата с помощью grep -n
Чтобы показать номер строки файла при сопоставлении строк. Нумерация строк для каждого файла ведется на основе 1. Используйте опцию -n, чтобы воспользоваться этой функцией.
$ grep -n "go" demo_text
5: * e - go to the end of the current word.
6: * E - go to the end of the current WORD.
7: * b - go to the previous (before) word.
8: * B - go to the previous (before) WORD.
9: * w - go to the next word.
10: * W - go to the next WORD.