grep : как раскрасить 2 ключевых слова?

Вопрос или проблема

Я знаю, как найти 2 ключевых слова с помощью 1 команды, но я могу сделать так, чтобы в выводе было выделено только одно из них. Вот моя команда:

grep 'keyword1' file.log | grep 'keyword2'

Только keyword2 выделено. Как сделать так, чтобы keyword1 также выделялось одновременно?

Команда grep принимает опцию --color=always, так что вы можете использовать

grep 'keyword1' file.log --color=always | grep 'keyword2'

Как указывает gertvdijk, эта команда может быть неэффективной, но она будет искать все строки, которые содержат и keyword1, и keyword2. Если вы хотите выделить их разными цветами, вы можете использовать

grep 'keyword1' file.log --color=always | GREP_COLORS="mt=01;34" grep --color=always 'keyword2'

что выделит keyword2 синим цветом. Часть mt означает, что grep выделит совпадающий текст с помощью этого CSI кода, а 01;34 означает “жирный синий текст на обычном фоне”.

Попробуйте использовать регулярные выражения, а не перенаправлять вывод в другой экземпляр grep, например:

grep -E "\<foo\>.*\<bar\>" file

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

Для совпадения по принципу ‘или’ я регулярно использую:

grep -E "(foo|bar)" file

Это могло бы быть просто так:

grep 'keyword1' file.log | grep 'keyword2' | grep 'keyword1\|keyword2'

Ответ или решение

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

Основные методы выделения двух ключевых слов

  1. Пайп через несколько grep:

    Ваш исходный метод с использованием двух grep выглядит так:

    grep 'keyword1' file.log | grep 'keyword2'

    Это точно будет выводить строки, содержащие оба ключевых слова, но при этом выделить только одно из них — с помощью дополнительных параметров это не достигается. Если вы хотите выделить оба ключевых слова, вам потребуется использовать опцию --color=always в обоих случаях.

    Пример:

    grep --color=always 'keyword1' file.log | GREP_COLORS='mt=01;34' grep --color=always 'keyword2'

    Разъяснение: данная команда выделит keyword1 по умолчанию, а keyword2 выделится синим цветом (код 01;34), что сделает разметку более наглядной.

  2. Использование регулярных выражений с -E:

    Если оба ключевых слова могут находиться на одной строке и вы хотите использовать выражения, можно воспользоваться регулярными выражениями с флагом -E (расширенные регулярные выражения). Например:

    grep -E --color=always '(keyword1|keyword2)' file.log

    Это позволит выделить оба слова в одном выводе. Однако это приведет к тому, что общее выделение будет одинаковым для обоих слов.

  3. Индивидуальная настройка подсветки:

    Для более адаптивной подсветки нескольких ключевых слов вы также можете использовать переменные окружения GREP_COLORS для задания цвета каждому слову:

    GREP_COLORS="mt=01;31" grep --color=always 'keyword1' file.log | GREP_COLORS="mt=01;34" grep --color=always 'keyword2'

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

  4. Вариант с использованием альтернатив:

    Если вам нужно выделить ключевые слова по логике "или", то это можно сделать так:

    grep -E --color=always '(keyword1|keyword2)' file.log

    В этом случае оба слова будут выделены, но все же в одном и том же цвете.

Заключение

Таким образом, одновременное выделение двух ключевых слов с помощью grep — это тривиальная задача, которая требует лишь немного больше внимания к деталям. Использование опции --color=always вместе с настройками GREP_COLORS позволяет эффективно решить эту задачу. Каждый из предложенных методов имеет свои особенности и может использоваться в зависимости от ваших потребностей и предпочтений.

Оцените материал
Добавить комментарий

Капча загружается...