Ответы:
Команда 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, или если это даже необходимо для этого случая (который, как представляется, файл журнала, который, вероятно, будет иметь стандартный порядок для ключевых слов). Я добавил свой ответ до того, как вы обновили свой, но я буду держать его в курсе, если возникнет ситуация, когда цепочка greps действительно необходима (или в любое другое время, когда цветной вывод не следует отправлять на терминал, например grep | less -R).