继续我的上一篇文章 read line by line with awk and parse variables
我想缓冲字段的结果以加快日志行的解析
我试过了
SELECT *,
COUNT(Approved) OVER (PARTITION BY Approved) AS Count_Approved
FROM
Approvals
ORDER BY
Site_Code;
但我得到语法错误......
CIP = [IPADDRESS]
所以我试图缓冲IP地址,以便它不会一直运行geoiplookup脚本,因为它会减慢解析...
感谢任何帮助...
答案 0 :(得分:1)
我没有看到缓冲的直接问题,因为它似乎在这个例子中起作用::
echo "172.217.22.132\n172.217.22.132" | \
awk '{CIP=$1}
(buffer[CIP]==0) { print "Calling geoiplookup";
cmd="geoiplookup "CIP;
cmd | getline buffer[CIP];
close(cmd) }
{print buffer[CIP]}'
这会产生:
Calling geoiplookup
GeoIP Country Edition: US, United States
GeoIP Country Edition: US, United States
如你所见它只被调用一次,所以缓冲有效。
但是您的代码中存在错误,以下情况应该会更好。
awk 'BEGIN{OFS=","}
{ FS="\""; $0=$0; CIP=$4; }
(buffer[CIP]==0) { cmd="geoiplookup "CIP; cmd | getline buffer[CIP]; close(cmd) }
...
{print "CIP,..." >> mysql.infile }' $1
我认为这里的主要问题是理解awk
语法。
以简单的形式,您应该将awk理解为line
或record
解析器。 awk语言是由一组形式的规则构建的
pattern1 { action1 }
pattern2 { action2 }
...
应解释为:如果满足pattern1
,则在当前行上执行action 1
。然后继续pattern2
。如果没有给出模式,则假定为true
并执行相应的操作。
在上面的第一个例子中,有3条规则。
{CIP=$1}
指出,作为第一个操作,将变量CIP
置于$1
(buffer[CIP]==0) { print ... }
声明第二个操作(print ...
)仅在buffer[CIP]
为零时执行,即该值尚未计算。我希望这有帮助。