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

时间:2018-10-03 10:13:14

标签: bash command-line grep pipe file-search

我正在完成一个涉及解决谋杀谜团的命令行游戏/挑战。

其中一个步骤是使用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牌照的Blue Honda的匹配项?换句话说,什么命令允许grep查找并显示多个匹配搜索词的结果?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

首先要意识到您是grep ping记录,而不是行。

因此将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'