我想搜索一个字符串并拉出两个模式(包括模式)之间的所有线条。
开始#1 姓名 S 101 法兰克福_1_1 19 号 A+ 街道 结尾 开始#2 姓名B 104 柏林 20 A+ 街道 结尾 开始#100 姓名C 107 柏林 21 A+ 街道 结尾 开始#24 姓名 D 110 法兰克福_1_1 21 A+ 结尾
如果我是grep
法兰克福
然后它必须显示 START 和 END 之间的所有行(包括 START 和 END),例如:
开始#1 姓名 S 101 法兰克福_1_1 19 号 A+ 街道 结尾 开始#24 姓名 D 110 法兰克福_1_1 21 A+ 街道 结尾
我使用的命令:
猫文件| awk '/START/,/END/' | '/START/,/END/' | grep -p 法兰克福
但这没有用。
答案1
不确定 awk 是该工作的正确工具,因为您的搜索是基于多行的。我认为这是 perl 的工作。浏览您可以使用的文件(类似于 awk 语句):
if (/^START/ .. /^END/){}
在那里,您将行存储在一个数组中,如果满足法兰克福,您将打印该行(此处使用布尔值):
push @lines, $_;
if (/Frankfurt/)
$toPrint = 1;
在所有情况下,当您超出模式时,如果您的布尔值为真,则打印数组,否则不要打印,清空数组。
答案2
我们绝对可以使用awk
,试试这个
awk -v RS="END" '$0~/Frankfurt/{print $0 RS}' 文件