要从包含“hi”的行打印到包含“bye”的行,我这样做:
awk '/嗨/./再见/'
要从包含“hi”的行打印到文件末尾,我会:
awk '/hi/,0'
如何编写脚本以在任一结束条件下结束打印?
在awk
使用变量p
作为标志时:
$ cat file
start
line 2
hi
line 4
bye
end
$ awk '/hi/{p=1}{if (p) print}' file
hi
line 4
bye
end
$ awk '/hi/{p=1}{if (p) print}/bye/{p=0}' file
hi
line 4
bye
更简洁:
$ awk '/hi/{p=1}p' file
hi
line 4
bye
end
$ awk '/hi/{p=1}p;/bye/{p=0}' file
hi
line 4
bye
不过我喜欢sed
这个:
$ sed -n '/hi/,/bye/p' file
hi
line 4
bye
$ sed -n '/hi/,$p' file
hi
line 4
bye
end
我尝试重新解决您的问题:
我想从包含“hi”的行打印一个文件,直到包含“bye”的行,如果文件中没有“bye”,我从“hi”打印到 EOF。(带 awk)
如果我的理解是正确的,其实你已经给了自己答案:
awk '/hi/,/bye/'
将完成这项工作。
让我们测试一下awk '/5/,/0/'
kent$ seq 12 |awk '/5/,/0/'
5
6
7
8
9
10
kent$ seq 9 |awk '/5/,/0/'
5
6
7
8
9
在第二个命令中,“文件”中没有 0,所以它只会从 /5/ 打印到最后。
Note
在“找到”的情况下,您必须处理“退出”,否则如果在“再见”之后有包含“嗨”的行,它们也会被打印出来。
我希望这是你问的。
awk '/hi/{f=1} f; /bye/{f=0}' file
如果您想打印任何一个或两个分隔线,只需重新排序这 3 个条件。