grep: як розфарбувати 2 ключові слова?


12

Я знаю, як зв'язати 2 ключові слова за допомогою 1 команди, але мені вдається лише розфарбувати одне з них у висновку. Ось моя команда:

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

Виділено лише keyword2. Як я можу зробити keyword1підсвічування одночасно?

Відповіді:


15

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буде виділити відповідний текст з допомогою цього ІКА коди , і 01;34означає «жирний синій передній план на тлі нормального».


1
+1 для детального пояснення та параметрів налаштування для випадку використання!
gertvdijk

Смішно, коли я пробую це за допомогою: grep -R --color = завжди ключове слово1. | grep ключове слово2 // виділяється лише перше ключове слово. Як я міг адаптувати вашу відповідь для роботи з рекурсивним пошуком?
TenLeftFingers

1
Це дивно, grep -R --color=always keyword1 . | grep keyword2має працювати. Ви перенаправивши висновок знову (наприклад, по конвеєру другий grepв less -R)? Якщо це так, вам потрібно буде додати і --color=alwaysдо другого.
Даніель Н

Чудова відповідь! Щоб виділити обидва, --color=autoпотрібне було б для другого grep, відразу після 'keyword2'.
Луїс

@Luis Так, ти маєш рацію, що Греп принаймні часто за замовчуванням не має кольору (хоча це може бути варіантом часу конфігурації? Я не думаю, що у мене це було відмінено в 2013 році, коли він працював на моїй машині без цього ...). Я додав --color=alwaysдо відповіді, тому що ви, можливо, захочете передати його lessчи щось теж.
Даніель Н

3

Спробуйте фактичні регулярні вирази, а не передавайте інший екземпляр grep, наприклад:

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

Це, на жаль, обмежує відповідність рядків, у яких ці ключові слова відповідають лише в такому порядку. У будь-якому випадку, використання grepВашого запитання є досить неефективним, і вам слід цього уникати. Відповідь @DanielH досить набагато простіше для вашого випадку, напевно.

Для відповідності ключових слів "або" я використовую це регулярно:

grep -E "(foo|bar)" file

1
Я думаю, що ОП хоче лише рядки, що містять обидва ключові слова (команда, яку ви дали, дає всі рядки, що містять або одне).
Даніель Н

@DanielH Дякую, що вказали на це. Я оновив свою відповідь.
gertvdijk

Це все ще не працює, лише якщо foo приходить перед баром? Я не знаю, чи є кращий спосіб, ніж це foo.*bar|bar.*foo, чи це навіть потрібно для цього випадку (який, здається, є файлом журналу, який, мабуть, має стандартний порядок для ключових слів). Я додав свою відповідь перед тим, як ви оновили свою, але я буду тримати її на випадок, якщо виникла ситуація, коли ланцюжки greps дійсно необхідні (або будь-який інший кольоровий вихід не повинен надсилатися до терміналу, як grep | less -R).
Даніель Н
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.