3

如果我在我的目标文件上执行这个 grep,我会得到例如 275 作为结果。

但我想学习 awk,所以在 awk 中尝试了这个:

 awk 'BEGIN { count=0 } /my pattern/ { count++ } END { print count }' myfile.log

这将按预期打印 275。

所以变得雄心勃勃,我创建了一个这样的 awk 脚本:

BEGIN { 
   print "Log File Analysis";
   message=0;
   events=0;
}

{
  /message/  {  messages++;  }
  /event/    { events++;  }
}
END { 
  print "messages:\t" messages;
  print "events:\t" events;
}

我收到语法错误,

$ awk -f test_learn.awk test_log.log
awk: test_learn.awk:16:   /message/  {  messages++;  }
awk: test_learn.awk:16:              ^ syntax error

我究竟做错了什么?

我在 Windows 7 上使用来自 MinGW shell 的 awk。

4

1 回答 1

1

尝试

 awk 'BEGIN { count=0 }; /my pattern/{count++ }; END { print count }' myfile.log

或者

awk 'BEGIN { count=0};  { if ($0 ~ /my pattern/)  count++ }; END { print count };' myfile.log

更好的是,由于变量默认初始化为零,您不需要 BEGIN 块,所以

awk '/my pattern/{count++ }; END { print count };' myfile.log

您可以将默认循环应用于文件中的所有行,如使用 if 的 2d 示例中,或者您可以有多个块,按模式“过滤”,如上所述,并在您编辑的添加中。

当你做单行时,一些 awks 需要分号来将 BEGIN 和 END 块与主循环块分开。

编辑

与您的第二期相同的想法,并整合 Ed Morton 的改进(谢谢)

/message/  {  messages++  }
/event/    { events++  }

END { 
 print "Log File Analysis"
 print "messages:\t" messages
  print "events:\t" events
}

IHTH

于 2012-11-15T11:04:24.243 回答