![我想搜索一个字符串并拉出两个模式之间的所有线条](https://linux22.com/image/6471/%E6%88%91%E6%83%B3%E6%90%9C%E7%B4%A2%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%B9%B6%E6%8B%89%E5%87%BA%E4%B8%A4%E4%B8%AA%E6%A8%A1%E5%BC%8F%E4%B9%8B%E9%97%B4%E7%9A%84%E6%89%80%E6%9C%89%E7%BA%BF%E6%9D%A1.png)
我想搜索一个字符串并拉出两个模式(包括模式)之间的所有线条。
开始#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}' 文件