awk:显示匹配的正则表达式(多行)

时间:2012-09-12 13:35:15

标签: regex linux awk

我有一个看起来像这样的文件:

SF:/home/developer/project/test/resources/somefile.js
DA:1,2
DA:3,2
end_of_record
SF:/home/developer/project/src/resources/otherfile.js
DA:9,2
DA:15,2
DA:22,2
end_of_record

...some more SF:/home/xxx and end_of_record lines...

该文件包含以SF: ...开头且以end_of_record结尾的块。请注意,中间的行数(DA:x,x)可以不同。我想在第一行打印所有具有字符串“test”的块(例如“SF:/ home / developer / test / resources / ...”)。对于这个例子,我想要的输出是:

SF:/home/developer/project/test/resources/somefile.js
DA:1,2
DA:3,2
end_of_record

我想在 Linux 环境中执行此操作。

我的第一次尝试是使用“sed”命令执行此操作,但经过一些研究后,似乎“awk”更适合进行多行操作。

使用awk和Regex,这是我到目前为止的命令:

awk '/SF[:\/a-zA-Z0-9]*test[\/A-Za-z0-9.,:\n]*end_of_record/ {print}' FS="\n" RS="" examplefile

但它输出完整的examplefile,而不仅是第一行中包含“test”的块。我不确定我的正则表达式是否错误,或者我的awk电话中是否遗漏了某些内容。

如何在第一行中只获得带有“test”的块?

2 个答案:

答案 0 :(得分:3)

你需要一面旗帜:

awk '/^SF.*test.*/{f=1}f;/end_of_record/{f=0}' yourFile

答案 1 :(得分:1)

awk '{if($0~/SF:.*\/test\//){P=1;}if($0~/end_of_record/&& P==1){print;P=0;}if(P==1)print}' your_file