Ответы:
Команда grep
принимает --color=always
опцию, поэтому вы можете использовать
grep 'keyword1' file.log --color=always | grep 'keyword2'
Как указывает gertvdijk , эта команда может быть неэффективной, но она будет искать все строки, содержащие как ключевое слово1, так и ключевое слово2. Если вы хотите выделить их разными цветами, вы можете использовать
grep 'keyword1' file.log --color=always | GREP_COLORS="mt=01;34" grep --color=always 'keyword2'
который выделит ключевое слово 2 синим цветом. Эта mt
часть означает, что grep
будет выделен соответствующий текст с использованием этого кода CSI , и 01;34
означает «жирный синий передний план на нормальном фоне».
grep -R --color=always keyword1 . | grep keyword2
должно работать. Вы перенаправив вывод снова (например, по конвейеру второй grep
в less -R
)? Если это так, вам нужно добавить и --color=always
ко второму.
--color=auto
понадобится второе grep
, сразу после 'keyword2'
.
--color=always
к ответу, потому что вы можете захотеть передать это less
или что-то еще.
Попробуйте использовать действительные регулярные выражения, а не передавайте их другим экземплярам grep
, например:
grep -E "\<foo\>.*\<bar\>" file
Это ограничивает соответствие строк, в которых эти ключевые слова совпадают только в этом порядке, к сожалению. В любом случае, использование grep
в вашем вопросе довольно неэффективно, и вы должны избегать этого. Ответ @DanielH довольно намного проще для вашего случая, наверное.
Для соответствия ключевых слов 'или', я использую это регулярно:
grep -E "(foo|bar)" file
foo.*bar|bar.*foo
, или если это даже необходимо для этого случая (который, как представляется, файл журнала, который, вероятно, будет иметь стандартный порядок для ключевых слов). Я добавил свой ответ до того, как вы обновили свой, но я буду держать его в курсе, если возникнет ситуация, когда цепочка grep
s действительно необходима (или в любое другое время, когда цветной вывод не следует отправлять на терминал, например grep | less -R
).