Использование grep для поиска нескольких ключевых слов в разных строках

Я заканчиваю игру / вызов командной строки, которая включает раскрытие тайны убийства.

Одним из шагов является поиск подозреваемого с помощью grep для поиска нескольких ключевых слов в одном файле.

Однако этот файл содержит тысячи строк текста в следующем формате:

License Plate: L337ZR9
Make: Honda
Color: Red
Owner: Katie Park
Height: 6'2"

Я попытался использовать grep следующими способами:

cat vehicles | grep -i 'L337' | grep -i 'honda'
ls | grep -i 'honda\|blue\|L337'

Но, насколько я понимаю, эти команды дадут мне любой результат, который соответствует любому из трех моих поисковых терминов.

Какая команда мне нужна для поиска файла транспортного средства и отображения совпадений только для Blue Honda с номерным знаком L337 - другими словами, какая команда позволяет grep находить и отображать результаты нескольких совпадающих поисковых терминов?

2 ответа

Используйте GNU grep,

пример

Источник

License Plate: L337ZR9
Make: Honda
Color: Blue
Owner: Katie Park
Height: 6'2"
License Plate: L338ZR9
Make: Honda
Color: Black
Owner: James Park
Height: 6'0"

команда

grep -Pzo '\w+:\s*L337ZR9\n\w+:\s+Honda\n\w+:\s*Blue' file

Результат

Plate: L337ZR9
Make: Honda
Color: Blue

объяснение

От grep человек:

   -z, --null-data
          Treat the input as a set of lines,

ПРИМЕЧАНИЕ: grep (GNU grep) 2.20 проверенный

Сначала осознай, что ты grepпинг записей, а не строк.

Итак, объедините 5 строчных записей в одну строку:

cat licenseplates | paste - - - - -

Теперь это внезапно легко grep:

cat licenseplates | paste - - - - - |
  grep -i 'L337' | grep -i 'honda' | grep -i blue

Наконец, вам нужно сложить совпадающие строки обратно в записи из 5 строк:

cat licenseplates | paste - - - - - |
  grep -i 'L337' | grep -i 'honda' | grep -i blue |
  sed 's/\t/\n/g'
Другие вопросы по тегам