ubuntu AWK:逐段获取日志数据

62lalag4  于 2022-10-27  发布在  其他
关注(0)|答案(2)|浏览(142)

日志文件是

Oct 01 [time] a
Oct 02 [time] b
Oct 03 [time] c
.
.
.
Oct 04 [time] d
Oct 05 [time] e
Oct 06 [time] f
.
.
.
Oct 28 [time] g
Oct 29 [time] h
Oct 30 [time] i

而且它真的(数百万行)
我想要Oct 01Oct 30之间的日志
我可以呆呆地做这件事

gawk 'some conditions' filter.log

而且它工作正常。
并返回数百万个不好的日志行
因为我想一部一部地
像这样的事情

gawk 'some conditions' -limit 100 -offset 200 filter.log

每次我更改limitoffset
我可以拿到另一部分。
我怎么能做到这一点?

yhxst69z

yhxst69z1#

AWK解决方案我将利用GNU AWK完成以下任务,让file.txt内容

1
2
3
4
5
6
7
8
9

假设我想打印这样的行,第一个字段是奇数,从第3行开始,在第7行(含)结束,然后我可以使用GNU AWK,如下所示

awk 'NR<3{next}$1%2{print}NR>=7{exit}' file.txt

这将给你带来

3
5
7

解释:NR是内置变量,它保存n个数row,当处理3之前的行只去next行而不做任何事情时,当余数从除以2是非零时做print行,当处理第7行或更多行时只做exit。如果您正在处理相对较小的文件部分,则使用exit可能会显著提高性能。观察上面代码中3个模式-动作对的顺序:next是第一个,然后是您想要做的任何事情,exit是最后一个。如果您想了解更多关于NR的信息,请阅读8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

  • (在GNU Awk 5.0.1中测试)*
    Linux解决方案如果您更喜欢使用偏移量限制,那么您可以利用尾部组合,例如,对于file.txt以上
tail -n +5 file.txt | head -3

给出输出

5
6
7

注意到偏移量首先使用+之前的值,然后使用-之前的值进行限制。

vdgimpew

vdgimpew2#

使用OP的伪代码和一些实际的awk代码:

gawk -v limit=100 -v offset=200 '
some conditions { matches++                                # track number of matches
                  if (matches >= offset and limit > 0) {
                     print                                 # print current line
                     limit--                               # decrement limit
                  }
                  if (limit == 0) exit                     # optional: abort processing if we found "limit" number of matches
                }
' filter.log

相关问题