在awk脚本中的RegEx帮助

时间:2017-12-14 15:49:38

标签: awk

所以我有一个包含以下条目的日志文件:

[STAT] - December 11, 2017 13:16:05.360
.\something.cpp(99): [Text] Code::Open Port 1, baud 9600, parity 0, Stop bits 0, flow control 0

[STAT] - December 11, 2017 13:20:24.637
.\something\more\code.cpp(100): [log]
fooBarBaz[32] = 32, 1, 2, 7, 3, 1092, 5, 196875, 6, 270592, 20, 196870, 8, 289, 30, 196867, 11, 1156, 5, 196875, 28, 278784, 5, 196874, 32, 266496, 30,  6866, 36, 147712, 5, 196874,

[STAT] - December 11, 2017 13:20:40.939
.\something\more\code.cpp(100): [log]
fooBarBaz[8] = 8, 1, 2, 1, 31, 532992, 5, 196875,

[STAT] - December 11, 2017 13:18:16.214
.\something\more\code.cpp(100): [log]
fooBarBaz[12] = 12, 1, 2, 2, 17, 296960, 10, 196872, 51, 1792, 50, 196878,

在命令行上,我可以这样做:

gawk -F', *' '/fooBarBaz\[[^0].*\]/ {for (f=5; f<=NF; f+=4) print $f | "sort -n" }' log

产生如下输出:

3
6
8
11
17
28
31
32
36
51

我想要一个awk脚本做同样的事情,但到目前为止我的努力还没有 工作

#!/usr/local/bin/gawk -f                                                                                                                                                             

BEGIN { print "lines"
        FS=", *";
        /fooBarBaz\[[^0].*\]/
}
{
                {for (f=5; f<=NF; f+=4) print $f} 
        }

我不认为我的正则表达式声明在正确的位置,因为 运行gawk -f script.awk打印与我的数据无关的行。

我做错了什么?

tl; dr:在fooBarBaz而不是[0]的行上,我想解析从位置5开始的数字,然后将位置4解析到该行的末尾。

1 个答案:

答案 0 :(得分:2)

优化的GNU awk 解决方案:

parse_digits.awk脚本:

#!/bin/awk -f

BEGIN{
    FS=", *";
    PROCINFO["sorted_in"]="@ind_num_asc";
    print "lines";
}
/fooBarBaz\[[1-9]+[0-9]*\]/{
    for (i=5; i <= NF; i+=4) 
        if ($i != "") a[$i]
}
END{
    for (i in a) print i
}

用法:

awk -f parse_digits.awk inputfile

输出:

lines
3
6
8
11
17
28
31
32
36
51