使用 grep 在不同的行上搜索多个关键字

Using grep to search for multiple keywords on different lines

我正在完成涉及解决谋杀之谜的命令行 game/challenge。

其中一个步骤是使用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'

但据我所知,这些命令会给我任何与我的三个搜索词中的任何一个相匹配的结果。

我需要什么命令来搜索车辆文件并显示仅匹配车牌为 L337 的蓝色本田 - 换句话说,什么命令允许 grep 查找和显示多个匹配搜索词的结果?

使用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 已测试

首先意识到你是grepping记录,而不是线路。

所以将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'