awk范围和文本选择

awk范围和文本选择,awk,Awk,我知道如何在awk中使用范围运算符 awk '/start/,/stop/' file 是否可以选择范围运算符内的文本?ATM,我使用的是if语句 awk '/start/,/stop/ { if ($1~/foo/) { } }' file 有没有一种更为自动化的方法呢?永远不要使用范围表达式,因为它会使琐碎的作业变得非常简单,但当任务变得稍微有趣时,则需要完全重写或复制条件 而不是: awk '/start/,/stop/' file 使用: 然后你想做的就是: awk '/start

我知道如何在awk中使用范围运算符

awk '/start/,/stop/' file
是否可以选择范围运算符内的文本?ATM,我使用的是if语句

awk '/start/,/stop/ { if ($1~/foo/) { } }' file

有没有一种更为自动化的方法呢?

永远不要使用范围表达式,因为它会使琐碎的作业变得非常简单,但当任务变得稍微有趣时,则需要完全重写或复制条件

而不是:

awk '/start/,/stop/' file
使用:

然后你想做的就是:

awk '/start/{f=1} f{ if ($1~/foo/) { } } /stop/{f=0}' file

我假设您在空的
{}

中有一些想法,那么您的建议确实有效:

$ seq 1 15 | awk '/^6/,/^9/ { if ($1~/8/){print} else print "in range but not 8" }'
in range but not 8
in range but not 8
8
in range but not 8
但正如埃德·莫顿所说,这是一个脆弱的结构

例如,
是最低优先级,您可能会想一想为什么这不起作用:

$ echo "this one print" | awk '/^1/ , /^55/ || /this/'  
另一个例子。假设你有:

$ echo "a
b
c
---
d
e
f
---
g
h"
尝试使用范围运算符包括或排除
--
之间的所有内容。这是因为起始标记和结束标记相同,并且可以在同一行上确定一个范围

如果你训练你的肌肉记忆不做
/^x/,/^y/
,而是做
/^x/{flag=1}flag{whatever}/^y/{flag=0}
,那么就不会再抓头了:

$ echo "this one print" | awk '/^1/{flag=1} flag || /this/{print} /^55/{flag=0}'
this one print
或者

(如果要从包含反转为排除…,只需在结尾处更改为
!f

一般来说,您可以对范围和子范围执行此操作:

awk '/^start/ || /^end/{f= ! f; next} /e/ && f { what you do in sub range }' file

         ^         ^                            can be a single regex if same pattern
                                 ^              remove next to include in processing
                                      ^         applies to within range /start/,/end/
                                          ^  ^     because of the flag
$ echo "a
b
c
---
d
e
f
---
g
h" | awk '/^---$/{f= ! f; next}  f'
d
e
f
awk '/^start/ || /^end/{f= ! f; next} /e/ && f { what you do in sub range }' file

         ^         ^                            can be a single regex if same pattern
                                 ^              remove next to include in processing
                                      ^         applies to within range /start/,/end/
                                          ^  ^     because of the flag