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