再现grep“我的模式”myfile.log |排序| uniq | wc -l在awk中

时间:2012-11-15 10:51:41

标签: awk mingw

如果我在目标文件上执行此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。

1 个答案:

答案 0 :(得分:1)

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

OR

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的第2个示例中,或者您可以有多个块,按照模式“过滤”,如上所述,以及在您编辑的添加中。

当您使用单行时,有些awks需要使用分号来将BEGIN和END块与主循环块分开。

修改

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

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

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

IHTH