Как записать результат grep в файл

Обновлено: 06.07.2024

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Символы слова включают буквенно-цифровые символы ( az , AZ и 0-9 ) и символы подчеркивания ( _ ). Все остальные символы считаются несловесными символами.

Если вы запустите ту же команду, что и выше, включая параметр -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 .

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

Мне нужно сохранить результат команды grep в файл, но я также хочу, чтобы выходной файл был отформатирован и сохранял цвета точно так же, как в терминале.

Есть ли способ сделать что? Может быть, grep сохранит какой-то язык разметки? Если это невозможно, есть ли еще один инструмент, который может выполнить эту задачу?

Я пытаюсь выделить ключевое слово поиска в выходном файле, точно так же, как в терминале.

2 ответа

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

Теперь, когда вы печатаете файл на консоли, он будет напечатан с помощью цвета, потому что Bash интерпретирует эти символы как «использовать этот цвет».

Однако, если вы откроете его в редакторе, например vim, вы получите некоторые странные символы. Например, когда я использую команды

Выход выглядит правильно, когда я печатаю его с помощью cat, но когда я его открываю в vim, я получаю

[d4 ] Поэтому, если вы хотите использовать редактор, это, вероятно, не то, что вы хотите.

Правильно . я получал эти странные символы между ними и не понимал, что это такое. – Mhd.Tahawi 26 July 2014 в 12:55 Мне очень нравится, насколько просто / эффективно ваш ответ. просто кот выход :). это отлично подходит для краткосрочных (просто для меня достаточно сейчас). – Trevor Boyd Smith 23 February 2017 в 01:12 Подробно: это терминал (эмулятор), а не bash, который интерпретирует цветовые escape-последовательности (также странные символы). – masterxilo 3 May 2018 в 18:46

Если я правильно понял, вы хотите сохранить вывод терминала в текстовом файле, не так ли? Но вы хотите, чтобы он был отформатирован с цветами. Если это так, вот мои идеи:

Выделение вывода автоматически

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

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

, вы можете пойти на

Что сделает gedit (или любой достойный текстовый редактор) автоматически распознать, что вы говорите о bash кода, и выделит его соответствующим образом. Вам не нужно окрашивать вывод, программа сделает это для вас, если распознает тип кода, который он открывает. Если вы работаете с форматами другого типа, просто адаптируйте расширение к тому, чтобы лучше настроить то, что вы используете (например,> output.xml,> output.html,> output.py . и т. Д.). Удачи! :)

Выделение некоторых слов в выходном файле

Итак, если я его получил, вы хотите выделить слова, которые искали. Опять же, это невозможно сделать в текстовом файле просто потому, что это простой текст. Однако вы можете добавить в него некоторый формат очень простым способом, например, с использованием некоторого кодирования html. Это преобразует ваш результат в html-код, и когда вы откроете его с помощью программы, способной интерпретировать html (libreoffice writer, firefox и 10000 и т. Д.), Вы увидите некоторые слова с высокой яркостью.

Для этого предположим, что это ваш grep, экспортированный в html:

И теперь вы хотите выделить ключевой текст в своем выходе. Вы можете использовать sed, чтобы сделать это, например:

Фильтрация текстовой информации, подаваемой на вход (аналог grep)
В общем после процедурного С++ начали изучать Объектно ориентированную Джаву и первая задача.


От-grep-ать вывод команды
Приветствую. Помогите от-grep-ать вывод команды. Задача такая. Исключить из списка строки, которые.

Вывод части строки с использованием grep
Помогите пожалуйста выполнить задание! Есть файл friends.txt one=1 two=2 three=3 four=4.


Вывод только вхождения слова через grep
Здравствуйте. Подскажите, можно ли вывести через grep только вхождение слова? Поиск проходит с.

то все дальнейшие операции будут происходить на удаленной машине. Технически Вы можете сохранить результат Вашей работы, а потом скачать на свою машину.
Другой вариант: запускать ssh сразу с перенаправлением вывода в файл на своей машине. Спасибо! вы бы не могли показать пример второго варианта?


Grep, findstr Вывод только цифрового значения
Есть потребность мониторить(zabbix, grafana) количество файлов в директории, использую такую.

Как сохранить содержимое объекта RichTextBox в виде графической информации?
Здравствуйте. Подскажите, как можно сохранить содержимое объекта RichTextBox в виде графической.

Вывод информации в texBox2 и texBox3 на основании информации texBox1
Ребята, начанающему чайнику требуется помощь в написании проги. Прога пишется под тач скрин.


Вывод информации с условием, как?
Добрый вечер, дорогие помощники! Хочу спросить у Вас: как нужно поступить, чтобы вывести для.


Как сохранить вывод команд, пользуясь утилитой dd
Здравствуйте. Подскажите, как сохранить вывод 2-х команд: "uname -a" и "cat /pro/version", с.


Как собрать вывод по столбцам и сохранить в CSV?
Првиет сообщество. имеется вот такой вывод: 2170 989173935893 Alm.Manager4 <2170> .

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

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

Что такое grep?

Команда grep (расшифровывается как global regular expression print) - одна из самых востребованных команд в терминале Linux, которая входит в состав проекта GNU. Секрет популярности - её мощь, она даёт возможность пользователям сортировать и фильтровать текст на основе сложных правил.

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

Синтаксис grep

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

$ grep [опции] шаблон [имя файла. ]

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

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

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

Опции

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

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

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

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

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

В первом примере мы будем искать пользователя User в файле паролей Linux. Чтобы выполнить поиск текста grep в файле /etc/passwd введите следующую команду:

grep User /etc/passwd

В результате вы получите что-то вроде этого, если, конечно, существует такой пользователь:

А теперь не будем учитывать регистр во время поиска. Тогда комбинации ABC, abc и Abc с точки зрения программы будут одинаковы:

grep -i "user" /etc/passwd

Вывести несколько строк

Например, мы хотим выбрать все ошибки из лог-файла, но знаем, что в следующей строчке после ошибки может содержаться полезная информация, тогда с помощью grep отобразим несколько строк. Ошибки будем искать в Xorg.log по шаблону "EE":

grep -A4 "EE" /var/log/xorg.0.log

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

grep -B4 "EE" /var/log/xorg.0.log

Выведет целевую строку и 4 строчки до неё:

grep -C2 "EE" /var/log/xorg.0.log

Выведет по две строки с верху и снизу от вхождения.

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

Регулярные выражения grep - очень мощный инструмент в разы расширяющий возможности поиска текста в файлах. Для активации этого режима используйте опцию -e. Рассмотрим несколько примеров:

grep "^Nov 10" messages.1

Nov 10 01:12:55 gs123 ntpd[2241]: time reset +0.177479 s
Nov 10 01:17:17 gs123 ntpd[2241]: synchronized to LOCAL(0), stratum 10

Поиск в конце строки - спецсимвол "$":

grep "terminating.$" messages

Jul 12 17:01:09 cloneme kernel: Kernel log daemon terminating.
Oct 28 06:29:54 cloneme kernel: Kernel log daemon terminating.

Найдём все строки, которые содержат цифры:

grep "9" /var/log/Xorg.0.log

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

Рекурсивное использование grep

grep -r "mydomain.com" /etc/apache2/

В выводе вы получите:

grep -r "zendsite" /etc/apache2/
/etc/apache2/vhosts.d/zendsite_vhost.conf: ServerName zendsite.localhost
/etc/apache2/vhosts.d/zendsite_vhost.conf: DocumentRoot /var/www/localhost/htdocs/zendsite
/etc/apache2/vhosts.d/zendsite_vhost.conf: <Directory /var/www/localhost/htdocs/zendsite>

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

grep -h -r "zendsite" /etc/apache2/

ServerName zendsite.localhost
DocumentRoot /var/www/localhost/htdocs/zendsite
<Directory /var/www/localhost/htdocs/zendsite>

Поиск слов в grep

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

grep -w "abc" имя_файла

Поиск двух слов

Можно искать по содержимому файла не одно слово, а два сразу:

egrep -w 'word1|word2' /path/to/file

Количество вхождений строки

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

grep -c 'word' /path/to/file

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

grep -n 'root' /etc/passwd

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

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

grep -v пар /path/to/file

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

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

grep -l 'primary' *.c

Цветной вывод в grep

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

grep --color root /etc/passwd


Выводы

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

Читайте также: