Как использовать команду fgrep для поиска текстовых строк в файлах
Кратко. В этом руководстве для начинающих мы обсудим некоторые практические примеры команды fgrep. К концу этого руководства пользователи смогут эффективно выполнять операции текстового поиска с помощью интерфейса командной строки.
Поиск текста — одна из наиболее часто выполняемых операций. Однако эта простая задача быстро становится трудоемкой, если пользователи не знакомы с правильными инструментами. В Linux существуют различные утилиты фильтрации текста, такие как awk, sed, cut и т. д.
Однако в Linux fgrep является наиболее предпочтительной утилитой для простого поиска текста. В этом руководстве мы обсудим некоторые практические примеры команды fgrep, которые можно использовать в повседневной жизни.
Команда fgrep в Linux относится к семейству команд grep. Однако он используется для поиска шаблона фиксированной строки вместо регулярных выражений. Следовательно, имя команды — fgrep (Fixed GREP).
Синтаксис команды fgrep аналогичен синтаксису других команд семейства grep:
fgrep [OPTIONS] PATTERNS [FILES]
Для начала давайте создадим простой текстовый файл со следующим содержимым в качестве примера:
cat input.txt
Здесь мы видим, что текстовый файл готов с содержимым образца. Теперь давайте обсудим некоторые распространенные примеры использования команды fgrep в следующих нескольких примерах.
1. Чем fgrep отличается от команд grep и egrep?
Как следует из названия, команда fgrep используется для поиска шаблонов фиксированных строк. Он интерпретирует шаблон как фиксированную строку, а не как регулярное выражение. Следовательно, он выполняет операцию поиска эффективно по времени.
Чтобы понять разницу, давайте используем точку (.)
с командой grep.
Это простое регулярное выражение соответствует любому отдельному символу, кроме конца строки:
grep ha. input.txt
В приведенном выше выводе мы видим, что символ точки (.)
соответствует тексту har, hat и has . .
Теперь давайте воспользуемся тем же шаблоном с командой fgrep и посмотрим на результат:
fgrep ha. input.txt
В приведенном выше выводе мы видим, что команде не удается найти заданный шаблон.
Это происходит потому, что команда fgrep не распознает регулярные выражения и пытается найти несуществующий шаблон — “ha.
.
2. Как искать шаблон в файле
Начнем с простого примера, где мы будем искать строку Professional в файле input.txt:
fgrep professionals input.txt
Как мы видим, сопоставление с образцом выполнено успешно в двух местах и выделено красным цветом.
3. Как установить цвет вывода Grep для совпадающих шаблонов
В предыдущем примере мы видели, что по умолчанию совпадающий шаблон выделяется красным цветом. Однако мы можем изменить это поведение, присвоив другое значение переменным среды GREP_COLOR
.
Давайте присвоим значение 32 переменной среды GREP_COLOR
, чтобы выделить соответствующий шаблон зеленым цветом:
export GREP_COLOR=32
fgrep professionals input.txt
Теперь, прежде чем перейти к следующему примеру, отключите переменную среды GREP_COLOR, чтобы включить поведение по умолчанию:
unset GREP_COLOR
4. Как искать несколько шаблонов в файле
Иногда нам нужно выполнить сопоставление шаблонов для нескольких строк. В таких случаях мы можем предоставить шаблоны из текстового файла вместо аргумента командной строки.
Давайте создадим текстовый файл, содержащий несколько шаблонов в отдельной строке:
cat pattern.txt
professionals
website
Теперь давайте используем этот файл с опцией -f
для сопоставления нескольких шаблонов:
fgrep -f pattern.txt input.txt
В приведенном выше выводе мы видим, что сопоставление с шаблоном выполнено успешно для строк специалисты и веб-сайт.
5. Как ограничить количество совпадений в файле
По умолчанию команда fgrep продолжает выполнять сопоставление с шаблоном до тех пор, пока не будет обработан весь файл.
Однако иногда нам необходимо ограничить количество совпадений. В таких случаях мы можем использовать опцию -m
с командой:
fgrep -m 1 professionals input.txt
TecMint was started on 15th August 2012 by technical professionals and all the
В этом примере команда fgrep останавливает обработку файла после соответствия первому шаблону.
6. Как распечатать имя файла при поиске шаблона
Иногда нам просто нужно найти название файлов, в которых присутствует тот или иной шаблон. В таких случаях мы можем использовать опцию -l
команды fgrep:
fgrep -l professionals input.txt
input.txt
Здесь мы видим, что команда просто печатает имя файла вместо строк с совпадающими шаблонами.
7. Как распечатать имя файла при сбое сопоставления с образцом
В предыдущем примере мы увидели, как вывести имя файла в случае успешного сопоставления с образцом. Теперь посмотрим, как выполнить операцию в обратном порядке.
Попробуем найти в файле несуществующий паттерн и наблюдать за результатом:
fgrep -L non-existing-word input.txt
input.txt
В этом примере мы использовали опцию -L
команды, которая печатает имя файла, если сопоставление с образцом не удалось.
8. Как подавить сообщения об ошибках
Обработка ошибок играет решающую роль при написании сценариев оболочки. Однако в некоторых некритических сценариях мы можем спокойно игнорировать сообщения об ошибках.
В fgrep мы можем использовать параметр -s
, который подавляет ошибки, связанные с несуществующими или нечитаемыми файлами. Чтобы лучше понять это поведение, попробуем поискать закономерность в несуществующем файле:
fgrep -s professionals non-existing-file.txt
echo $?
2
В приведенном выше выводе мы видим, что команда не отображает никаких ошибок в стандартном потоке ошибок. Однако об ошибке сообщает ненулевое возвращаемое значение.
В дополнение к этому мы также можем наблюдать такое же поведение, когда файл не читается. Итак, сначала измените права доступа к файлу с помощью команды chmod:
chmod 000 input.txt
ls -l input.txt
Теперь попробуйте найти закономерность и наблюдать за результатом:
fgrep -s professionals input.txt
echo $?
9. Как исключить частично совпадающие линии
В предыдущих примерах мы видели, что команда fgrep выполняет частичное совпадение. Однако в некоторых случаях нам необходимо выполнить точное сопоставление для всей строки. В таких случаях мы можем использовать опцию -x
команды fgrep.
fgrep -nx "the same site is sometimes hard to find." input.txt
В приведенном выше выводе точное совпадение строк происходит в строке номер 20.
10. Как исключить файлы при рекурсивном поиске
Иногда нам нужно пропустить определенные файлы при выполнении операций поиска. В таких случаях мы можем использовать опцию --exclude
команды fgrep.
Чтобы понять это, сначала создайте каталог и скопируйте в него несколько файлов-примеров:
mkdir dir-1
cp input.txt dir-1/input.txt
cp input.txt dir-1/input.data
cp input.txt dir-1/input.md
Теперь поищем шаблон во всех файлах каталога dir-1, кроме файлов “.txt”
:
fgrep -r --exclude *.txt professionals dir-1
В приведенном выше выводе мы видим, что сопоставление с образцом было выполнено для файлов с расширениями “.md ”
и “.data ”
.
11. Как исключить несколько типов файлов при рекурсивном поиске
В предыдущем примере мы увидели, как исключить файлы с определенными расширениями. Однако команда становится длинной, когда мы хотим исключить файлы с несколькими расширениями. В таких случаях мы можем предоставить шаблон исключения из файла вместо аргумента командной строки:
Итак, давайте создадим текстовый файл, содержащий несколько шаблонов исключения в отдельной строке:
cat skip-pattern.txt
*.txt
*.data
Теперь давайте используем этот файл с опцией --exclude-from
:
fgrep -r --exclude-from skip-pattern.txt professionals dir-1
Здесь мы видим, что сопоставление с образцом выполнялось только для файлов с расширениями “.md ”
.
12. Как включать файлы при рекурсивном поиске
В предыдущих примерах мы видели, как исключать файлы при рекурсивном выполнении операций поиска. Теперь посмотрим, как выполнить операцию в обратном порядке.
Давайте воспользуемся опцией --include
команды fgrep для выполнения поиска по файлам с расширением “*.txt”
:
fgrep -r --include "*.txt" professionals dir-1
В приведенном выше выводе мы видим, что сопоставление с образцом пропускается для файлов с расширениями “*.md ”
и “*.data ”
.
В этой статье мы обсудили некоторые полезные примеры команды fgrep. Новички могут использовать эти примеры в повседневной жизни, чтобы повысить производительность при работе с Linux.
Знаете ли вы какой-нибудь другой лучший пример команды fgrep в Linux? Поделитесь с нами своим мнением в комментариях ниже.