如果我对我的目标文件执行此 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。
最佳答案
尝试
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 block ,所以
awk '/my pattern/{count++ }; END { print count };' myfile.log
您可以将默认循环应用到文件中的所有行,如 2d 示例中的 if,或者您可以有多个 block ,按模式“过滤”,如上所述,并在您编辑的添加中。
当您使用单行代码时,一些 awk 要求使用分号将 BEGIN 和 END block 与主循环 block 分开。
编辑
与您的第 2 期相同的想法,并整合了 Ed Morton 的改进(感谢)
/message/ { messages++ }
/event/ { events++ }
END {
print "Log File Analysis"
print "messages:\t" messages
print "events:\t" events
}
健康教育
关于awk - 重现 grep "my pattern"myfile.log |排序 |独特 | awk 中的 wc -l,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13395971/