Поиск по сайту:

Как выполнить поиск по шаблону в файлах с помощью Grep


На этой странице

  1. Поиск без учета регистра с помощью Grep
  2. Отображать определенные несовпадающие строки со строкой, содержащей совпадающую строку в Grep
  3. Выводить только совпадающие строки в Grep
  4. Отображать позицию в Grep
  5. Заключение

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

Обратите внимание, что все примеры, упомянутые в этом руководстве, были протестированы на Ubuntu 14.04LTS. Кроме того, мы будем использовать следующий файл (test_file1.txt) для всех наших примеров, связанных с grep в этом руководстве:

Поиск без учета регистра с помощью Grep

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

grep -i [string-to-be-searched] [filename]

Например:

grep -i "linux" test_file1.txt

Примечание. Не только шаблон (например, linux в приведенном выше примере), на странице руководства grep говорится, что параметр -i также гарантирует, что учет регистра для входных файлов также игнорируется. Вот отрывок:

 -i, --ignore-case
Ignore case distinctions in both the PATTERN and the input files. (-i is specified by POSIX.)

Однако нам не удалось воспроизвести поведение, связанное с входными файлами, с нашей стороны.

Отображать определенные несовпадающие строки со строкой, содержащей совпадающую строку в Grep

С помощью этого инструмента вы также можете отобразить указанное количество строк после, до или вокруг строки, содержащей совпадающую строку.

Используйте параметр командной строки -A, чтобы напечатать N строк после совпадающей строки.

$ grep -A N [string-to-be-searched] [filename]

Например:

$ grep -A 2 "linux" test_file1.txt

Вот вывод вышеуказанной команды

Точно так же параметр командной строки -B используется для отображения строк перед совпавшей строкой.

$ grep -B N [string-to-be-searched] [filename]

Например:

$ grep -B 2 "linux" test_file1.txt

Вот результат:

Наконец, чтобы напечатать строки вокруг совпадающей строки, используйте параметр командной строки -C.

$ grep -C N [string-to-be-searched] [filename]

Например:

$ grep -C 2 "linux" test_file1.txt

Вот результат:

Печатать только совпадающие строки в Grep

Вам также разрешено печатать только совпадающую строку на стандартном выходе (вместо полных строк, которые отображаются по умолчанию). Доступ к этой функции можно получить с помощью параметра командной строки -o.

$ grep -o [string-to-be-searched] [filename]

Например, если требуется найти строку \linux\ в файле (но не следует печатать полные строки), мы будем использовать следующую команду.

$ grep -o "linux" [file-name]

Мы также можем использовать подстановочные знаки, такие как * и .*, для поиска более одной строки. Например, если мы хотим собрать группу слов, начинающуюся с \how\ и заканчивающуюся \linux\, мы можем использовать следующую команду.

$ grep -o “how.*linux” [file-name]

Отображать позицию в Grep

Команда grep также позволяет отображать смещение в байтах строки, в которой встречается совпадающая строка. Доступ к этой функции можно получить с помощью параметра командной строки -b. Но для лучшего использования этой опции вы можете использовать ее с опцией командной строки -o, которая будет отображать точную позицию совпадающей строки.

$ grep -o -b [string-to-be-searched] [filename]

Например:

$ grep -o -b "for" test_file1.txt

Вот результат:

Заключение

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