fgrep

fgrep

fgrep относится к семейству команд grep. Однако, fgrep использует для поиска шаблона – фиксированные строки, вместо регулярных выражений. Отсюда и название команды fgrep (Fixed GREP).

Синтаксис команды fgrep аналогичен другим командам семейства grep:

fgrep [OPTIONS] PATTERNS [FILES]

Для демонстрации работы создадим обычный текстовый файл – input.txt, со следующим содержимым:

cat input.txt
 
TecMint.com is a website that publishes practical and useful out-of-the-box articles for aspirant like you and me. We seek to present exceptional, remarkable tips, tutorials, and resources that the modern web professional will appreciate.
 
TecMint was started on 15th August 2012 by technical professionals and all the articles and contents are written by talented professionals around the globe, keeping in high importance on quality, comprehensiveness, and usefulness goes into each of the articles published.
 
We, as a team wants to share our IT skills and experience through our website which may assist to formulate a task easy. It has been seen generally we found a majority of Linux related resources on the web to be either too detailed, too ambiguous, or just imprecise. There are many excellent articles on specific topics, but they were usually part of a general interest publication, and information on related topics on the same site is sometimes hard to find.

Как следует из названия, команда fgrep используется для поиска шаблонов фиксированные строки. Иными словами, интерпретирует шаблон как фиксированную строку, а не как регулярное выражение. Следовательно, операция поиска выполняется с минимальными временными затратами.

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

grep ha. input.txt

Вывод:


В приведенном выше выводе, мы видим, что символ точки соответствует тексту har, hat и has.

Теперь давайте используем тот же шаблон с командой fgrep и понаблюдаем за результатом:

fgrep ha. input.txt

В этом примере, команде не удается найти заданный шаблон. Это происходит потому, что команда fgrep не распознает регулярные выражения и пытается найти несуществующий шаблон – ha.

Давайте начнем с базового примера, в котором мы будем искать строку professional в файле input.txt:

fgrep professionals input.txt

Вывод:


Как видим, сопоставление с образцом удалось в двух местах, и оно выделено красным цветом.

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

Давайте присвоим переменной окружения GREP_COLOR значение 32, чтобы выделить совпавший шаблон зеленым цветом:

export GREP_COLOR=32
fgrep professionals input.txt


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

unset GREP_COLOR

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

Давайте создадим текстовый файл pattern.txt, содержащий несколько шаблонов на отдельной строке:

cat pattern.txt
 
professionals
website

Давайте теперь используем этот файл с опцией -f для множественного сопоставления шаблонов:

fgrep -f pattern.txt input.txt


В приведенном выше выводе видно, что для строк professionals и website сопоставление шаблонов прошло успешно.

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

fgrep -m 1 website input.txt
TecMint.com is a website that publishes practical and useful out-of-the-box articles for aspirant like you and me. We seek to present exceptional, remarkable tips, tutorials, and resources that the modern web professional will appreciate.

В этом примере команда fgrep останавливает обработку файла после совпадения с первым шаблоном.

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

fgrep -l professionals *.txt
 
input.txt
pattern.txt

В предыдущем примере мы рассмотрели, как вывести имя файла при успешном совпадении шаблонов. Теперь посмотрим, как выполнить эту операцию в обратном порядке. Попробуем найти несуществующий шаблон в файле:

fgrep -L non-existing-word input.txt
 
input.txt

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

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

В fgrep мы можем использовать опцию -s, которая подавляет ошибки, связанные с несуществующими или нечитаемыми файлами. Чтобы лучше понять это поведение, давайте попробуем поискать шаблон в несуществующем файле:

fgrep -s professionals non-existing-file.txt
 
echo $?
2

В приведенном выше выводе видно, что команда не выводит никакой ошибки в стандартный поток ошибок. Однако о неудаче сообщает ненулевое возвращаемое значение. Кроме того, мы можем наблюдать такое же поведение, когда файл не читается. Итак, сначала измените разрешение файла с помощью команды chmod:

chmod 000 input.txt
ls -l input.txt
----------. 1 root root 974 Nov 18 08:49 input.txt

Теперь попробуем поискать шаблон:

fgrep -s professionals input.txt
 
echo $?
2
  • fgrep.txt
  • Последнее изменение: 2022/11/18 11:00
  • admin