所以我有一个包含以下条目的日志文件:
[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解析到该行的末尾。
答案 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