awk - 重现 grep "my pattern"myfile.log |排序 |独特 | awk 中的 wc -l

标签 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。

最佳答案

尝试

 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/

相关文章:

html - 仅使用 sed 或 awk 从 html 页面中提取 url 的最简单方法

shell - 如何在搜索中使用 awk 变量?

c++ - MinGw 4.7.0 不使用#include <boost/thread> 编译代码

c++ - gcc 4.7.2 虚函数错误

c++ - 使用 vpaths 时需要两次 "make"

linux - 使用 AWK 打印除第一列之外的所有列

awk - 在表格数据上使用带有 shell 模块的 awk 条件语句在 Ansible 中没有按预期工作

c++ - 递归模板 : compilation error under g++

linux - 将多个文本 block 提取到一个新文件中

c++ - C++ 用户定义文字的 Eclipse/MinGW 问题