将grep用于输出文件中多行的多个模式

时间:2016-11-02 06:10:43

标签: linux unix grep

我在文件中捕获了类似的数据输出。

  • 列出item1

attrib1:someval11

attrib2:someval12

attrib3:someval13

attrib4:someval14

  • 列出项目2

attrib1:someval21

attrib2:someval12

attrib4:someval24

attrib3:someval23

  • 列出项目3

attrib1:someval31

attrib2:someval32

attrib3:someval33

attrib4:someval34

我想仅在" attrib2为someval12 "

时从数据列表中提取attrib1,attrib3,attrib4。

请注意attrib3和attrib4可以在attrib2之后的任何顺序。

到目前为止,我尝试使用带有-A和-B选项的grep,但我需要指定行号,这是一种我不想做的硬编码。

grep -B 1 -A 1 -A 2" attrib2:someval12" | egrep -w" attrib1 | attrib3 | attrib4"

我可以使用grep的任何其他选项,它不涉及为此示例指定之前和之后的事件吗?

1 个答案:

答案 0 :(得分:0)

Grep和其他工具(如join,sort,uniq)的工作原理是“每行一条记录”。因此可以使用3步管道:

  1. 使用sed。将每个列表项转换为单行。
  2. 使用grep。
  3. 进行过滤
  4. 使用sed。
  5. 转换回原始格式

    首先,您需要选择一个已知未在输入中出现的字符,并将其用作分隔符。例如,'|'。

    然后,找到步骤1的sed命令,该命令将输入​​转换为格式

    • 列出item1 | attrib1:someval11 | attrib2:someval12 | attrib3:someval13 | attrib4:someval14 |
    • 列出item2 | attrib1:someval21 | attrib2:someval12 | attrib4:someval24 | attrib3:someval23 |
    • 列表项3 | attrib1:someval31 | attrib2:someval32 | attrib3:someval33 | attrib4:someval34 |

    现在第2步很简单。