当作为 CLI 传递时,我发现了大量 AWK Ranges 示例。例如:
awk '/start/,/end/' file
如何在 AWK 文件中嵌入范围?
#!/usr/bin/awk -f
BEGIN{
}
{
# how do I express those "start" and "end" ranges?
}
END {
}
我的文本文件看起来像这样:
...
don't care
don't care
start
record of interest
record on interest
...
end
don't care
don't care
...
答案1
awk 脚本的主体具有以下形式:
*pattern* *action*
其中任何一个都可以省略。省略图案意味着行动总是被执行。省略行动默认打印当前行。
表达范围的自然方式是图案部分,像这样:
BEGIN {
somevar=5
}
/start/,/end/ { print }
END {
somevar=6
}
(我留在 BEGIN 和 END 部分,只是为了保持与开始时相同的结构)。
要在行动部分需要跟踪您所在的位置:
BEGIN {
p=0
}
{
if (/start/) p=1
if (p) { print }
if (/end/) p=0
}
END {
p=0
}
在这里,没有图案, 所以行动块针对每一行执行。一旦我们看到匹配/p
的行,我们就将标志 ( ) 设置为 1 或“true”;/start
如果(且仅当)该标志为真,我们打印该行。如果我们看到/end
/,则重置标志。 BEGIN 和 END 块在这里是多余的; awk 中的变量默认为零/假。
答案2
oot@localhost ~]# i=`awk '/care/{print NR}' l.txt| sort -nr| sed -n '1p'`
[root@localhost ~]# awk -v i="$i" '/care/{x=NR+i}(NR<=x){print }' l.txt
don't care
don't care
start
record of interest
record on interest
...
end
don't care
don't care
...