我需要在两个模式之间提取一段文件, 从匹配第一个模式到匹配第二个模式两次
我有下一个文件
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/
提前致谢。
答案 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