【问题标题】:Using grep for multiple patterns from multiple lines in a output file对输出文件中多行的多个模式使用 grep
【发布时间】:2017-03-15 09:13:52
【问题描述】:

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

  • 列表项1

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 is someval12”时,我想从数据列表中提取attrib1、attrib3、attrib4。

请注意,attrib3 和 attrib4 可以在 attrib2 之后以任意顺序排列。

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

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

我可以使用 grep 的任何其他选项,它不涉及指定此示例的前后出现吗?

【问题讨论】:

    标签: linux unix grep


    【解决方案1】:

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

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

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

    然后,找到第 1 步的 sed 命令,它将输入转换为格式

    • 列表项1|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|

    现在第 2 步很简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 2019-07-31
      • 2019-08-11
      相关资源
      最近更新 更多