Использование 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'