【问题标题】:awk buffer variables to speed up parsing of linesawk 缓冲区变量以加快行的解析
【发布时间】:2017-11-24 08:53:11
【问题描述】:

从我的上一篇文章继续 read line by line with awk and parse variables

我想缓冲一个字段的结果以加快日志行的解析。
我试过了
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

但我收到语法错误...

CIP=[IP 地址]
所以我试图缓冲 IP 地址,这样它就不会一直运行 geoiplookup 脚本,因为它会减慢解析速度......

感谢任何帮助...

【问题讨论】:

  • 可以链接到以前的问题,但请尝试在此处包含足够的上下文,以便此问题可以自行回答。目前尚不清楚您要做什么。
  • 这更像是一个语法错误问题,而不是我实际上想要做的事情......无论如何我都会编辑问题以使其更清楚。
  • 你有 FS="\""; $0=$0; CIP=$4; 就在脚本的中间,而不是在块内 { }
  • @TomFenech :谢谢我做到了,但在(buffer[CIP]==0) { cmd="geoiplookup "CIP; cmd | getline buffer[CIP]; close(cmd) } 处仍然出现语法错误
  • 现在你有一个开口{,但没有结束}...

标签: bash awk buffer line


【解决方案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] 为零时执行,即尚未计算该值。
  • 最终规则规定打印缓冲值。

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 2021-11-13
    • 2019-07-12
    • 2020-09-11
    • 2014-01-13
    • 2013-01-02
    • 2018-04-09
    相关资源
    最近更新 更多