awk缓冲区变量以加速解析行

时间:2017-11-24 08:53:12

标签: bash awk buffer line

继续我的上一篇文章 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脚本,因为它会减慢解析...

感谢任何帮助...

1 个答案:

答案 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理解为linerecord解析器。 awk语言是由一组形式的规则构建的

pattern1 { action1 }
pattern2 { action2 }
...

应解释为:如果满足pattern1,则在当前行上执行action 1。然后继续pattern2。如果没有给出模式,则假定为true并执行相应的操作。

在上面的第一个例子中,有3条规则。

  • {CIP=$1}指出,作为第一个操作,将变量CIP置于$1
  • (buffer[CIP]==0) { print ... }声明第二个操作(print ...)仅在buffer[CIP]为零时执行,即该值尚未计算。
  • 最终规则状态打印缓冲值。

我希望这有帮助。