0

要从包含“hi”的行打印到包含“bye”的行,我这样做:

awk '/嗨/./再见/'

要从包含“hi”的行打印到文件末尾,我会:

awk '/hi/,0'

如何编写脚本以在任一结束条件下结束打印?

4

3 回答 3

5

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
于 2013-01-11T15:23:43.857 回答
2

我尝试重新解决您的问题:

我想从包含“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在“找到”的情况下,您必须处理“退出”,否则如果在“再见”之后有包含“嗨”的行,它们也会被打印出来。

我希望这是你问的。

于 2013-01-11T15:48:17.143 回答
0
awk '/hi/{f=1} f; /bye/{f=0}' file

如果您想打印任何一个或两个分隔线,只需重新排序这 3 个条件。

于 2013-01-11T17:28:32.360 回答