Вопрос или проблема
Я знаю, как найти 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
, существует несколько подходов, каждый из которых имеет свои преимущества и недостатки.
Основные методы выделения двух ключевых слов
-
Пайп через несколько
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
), что сделает разметку более наглядной. -
Использование регулярных выражений с
-E
:Если оба ключевых слова могут находиться на одной строке и вы хотите использовать выражения, можно воспользоваться регулярными выражениями с флагом
-E
(расширенные регулярные выражения). Например:grep -E --color=always '(keyword1|keyword2)' file.log
Это позволит выделить оба слова в одном выводе. Однако это приведет к тому, что общее выделение будет одинаковым для обоих слов.
-
Индивидуальная настройка подсветки:
Для более адаптивной подсветки нескольких ключевых слов вы также можете использовать переменные окружения
GREP_COLORS
для задания цвета каждому слову:GREP_COLORS="mt=01;31" grep --color=always 'keyword1' file.log | GREP_COLORS="mt=01;34" grep --color=always 'keyword2'
Этот метод позволяет задать разные цвета для каждого ключевого слова, однако введение таких изменений может потребовать дополнительных настроек и опытных знаний.
-
Вариант с использованием альтернатив:
Если вам нужно выделить ключевые слова по логике "или", то это можно сделать так:
grep -E --color=always '(keyword1|keyword2)' file.log
В этом случае оба слова будут выделены, но все же в одном и том же цвете.
Заключение
Таким образом, одновременное выделение двух ключевых слов с помощью grep
— это тривиальная задача, которая требует лишь немного больше внимания к деталям. Использование опции --color=always
вместе с настройками GREP_COLORS
позволяет эффективно решить эту задачу. Каждый из предложенных методов имеет свои особенности и может использоваться в зависимости от ваших потребностей и предпочтений.