如何在两种模式之间进行grep - 第二次出现BASH

时间:2017-12-14 00:12:44

标签: bash shell awk sed grep

我需要在两个模式之间提取一段文件, 从匹配第一个模式到匹配第二个模式两次

我有下一个文件

FileSet {
  Name = "FileseT-XXXXX"
   Include {
    Options {
      signature = MD5
     }
       File = /etc
       File = /usr/sbin
       File = /root
       File = /srv/
}
}

#SECOND FILESET
FileSet {
  Name = "FileseT-XXXXX2"
  Include {
    Options {
      signature = MD5
    }
       File = /srv/
}

}

我想基于' Name =" FileseT-XXXXX"'到第二个"}"获取文件的部分。

我想获得前四个"文件"

    File = /etc
    File = /usr/sbin
    File = /root
    File = /srv/

提前致谢。

2 个答案:

答案 0 :(得分:2)

您不需要像描述那样复杂只是为了在目标块中打印File =行。您所需要的只是:

$ awk '/Name = /{f=/"FileseT-XXXXX"/} f && /File =/' file
       File = /etc
       File = /usr/sbin
       File = /root
       File = /srv/

如果这不是您所需要的,那么请编辑您的问题以提供更具真实代表性的样本输入/输出。

答案 1 :(得分:0)

首先,我会通过匹配"FileseT-XXXXX"FileSet之间的数据来缩小数据集范围。然后我会提取所需的File部分。

这应该只提取文件:

pattern='XXXXX'

awk -v n="\"FileseT-$pattern\"" '$0 ~ n {flag=1; next} /FileSet/{flag=0} flag' your_data_file | awk '/File = / {print $0}'

您可以将模式保存到shell变量中。请注意,您可以在awk中使用带有-v标志的shell变量。这样,您可以轻松地在脚本中更改所需的模式。然后使用 awk 模式匹配,您可以从输出中提取"FileseT-XXXXX"FileSet的第一次出现之间的行。然后将结果(|)用于另一个 awk 调用,我们只提取所需的行。

<强> 修改

提取"FileseT-XXXXX"和第二次出现}之间的行:

awk -v n="\"FileseT-$n\"" '$0 ~ n {flag=1; next} /}/ && ++c == 2 {flag=0} flag' your_data_file