如何用awk提取两种模式之间的线条?

时间:2016-10-31 05:15:54

标签: shell awk

viewDidAppear

标志将打印$ awk '/abc/{flag=1; next} /edf/{flag=0} flag' file ,但我只需要两个字符串中的第一个匹配行。

输入:

$0

输出:

abc
111
222
edf
333
444
abc
555
666
edf

4 个答案:

答案 0 :(得分:1)

所以我假设您只想在第一次出现时打印出匹配的行。

为此,您可以使用其他变量,并在flag0后设置

$ cat file 
abc
111
222
edf
333
444
abc
555
666
edf
$ awk '/abc/{flag=1; next} /edf/{if(flag) got1stoccurence=1; flag=0} flag && !got1stoccurence' file
111
222

答案 1 :(得分:0)

如果您只想要第一组输出,那么:

awk '/abc/{flag=1; next} /edf/{if (flag == 1) exit} flag' file

或者:

awk '/abc/{flag++; next} /edf/{if (flag == 1) flag++} flag == 1' file

毫无疑问,还有其他方法可以做到这一点。第一个是简单而重要的。如果您还想处理出现在另一对模式之间的第一组线,则第二种更灵活。

请注意,如果输入文件包含:

xyz
edf
pqr
abc
111
222
edf

重要的是不要对第一个edf做任何事情;这是一条无趣的线,因为还没有读过abc行。

答案 2 :(得分:0)

getlinewhile一起使用:

$ awk '/abc/ { while(getline==1 && $0!="edf") print; exit }' file
111
222

查找/abc/,找到记录将在while循环中输出,直到找到edf

答案 3 :(得分:0)

$ awk '/edf/{exit} f; /abc/{f=1}' file
111
222

如果edf可能出现在输入中的abc之前,那么它将是:

$ awk 'f{if (/edf/) exit; print} /abc/{f=1}' file
111
222