博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
awk、sort等命令搞定几十行代码C++做的事------用好工具, 事半功倍
阅读量:4142 次
发布时间:2019-05-25

本文共 2160 字,大约阅读时间需要 7 分钟。

       在后台开发中, 经常遇到服务波动的情况, 一般来说, 在监控系统中可以看到这种波动, 那是否与我们机器上的错误log对应起来了呢? 我们有必要对机器上的错误log进行统计!

       规范log中一般会有时间, 假设时间格式为:  xxx[2016-11-20 hh:mm:ss]yyy,  那么怎样统计错误log是否集中在某以时间段呢? 写个C++程序吧:

       结果:

#include 
#include
#include
#include
#include
using namespace std;string findTime(const string &str){ unsigned int pos = str.find("[201"); if(pos == string::npos) { return "[system error]"; } return str.substr(pos, 21);}int main(){ ifstream in("data.txt"); // data.txt为log文件 string filename; string line; vector
vecString; map
m; if(in) // 有该文件 { while (getline (in, line)) // line中不包括每行的换行符 { if(line == "") { continue; } vecString.push_back(line); string time = findTime(line); m[time]++; } } else // 没有该文件 { cout <<"no such file" << endl; } map
::iterator it; for(it = m.begin(); it != m.end(); ++it) { printf("%s %d\n", it->first.c_str(), it->second); } return 0;}
        部分结果如下:

..................[2016-11-20 12:00:07] 15[2016-11-20 12:00:08] 23[2016-11-20 12:00:09] 18[2016-11-20 12:00:10] 19[2016-11-20 12:00:11] 13[2016-11-20 12:00:12] 29[2016-11-20 12:00:13] 18[2016-11-20 12:00:14] 21[2016-11-20 12:00:15] 15[2016-11-20 12:00:16] 15[2016-11-20 12:00:17] 14[2016-11-20 12:00:18] 10[2016-11-20 12:00:19] 16[2016-11-20 12:00:20] 20[2016-11-20 12:00:21] 13[2016-11-20 12:00:22] 29[2016-11-20 12:00:23] 15..................
       
       这个程序有两个毛病: 1. 没有按照频率排序(尽管改一改也可以做到) 2. 实际操作起来, 用起来不爽, 不方便, 不直接。 怎么办呢? 还是求助于awk、sort等命令吧:
cat data.txt | awk -F "2016-" '{printf("[2016-%14.14s]\n", $2)}' | sort |uniq -c|sort -rnk 1 | head -n 10
       结果为:

375 [2016-              ]     46 [2016-11-20 12:29:07]     41 [2016-11-20 12:27:45]     39 [2016-11-20 12:32:35]     38 [2016-11-20 12:27:20]     38 [2016-11-20 12:24:52]     37 [2016-11-20 12:32:48]     37 [2016-11-20 12:32:09]     36 [2016-11-20 12:27:25]     36 [2016-11-20 12:26:03]

        看看, 这是多么爽的结果, 用好工具, 真的能事半功倍奋斗

        如果要按照时间来排序, 观察随事变变化, 那就去掉sort -rnk 1吧。 还有个问题, 如果是每秒统计, 颗粒度太小, 结果太多, 我们可以改为更常用的按分统计: 如:

        cat data.txt | awk -F "2016-" '{printf("[2016-%11.11s]\n", $2)}' | sort |uniq -c|sort -rnk 1 | head -n 10

        cat data.txt | awk -F "2016-" '{printf("[2016-%11.11s]\n", $2)}' | sort |uniq -c

你可能感兴趣的文章
Wordpress实战之第二章安装wordpress 软件需要的软件
查看>>
2021年 人工智能AI重点分析 第四章Python的数据类型之数字类型
查看>>
2021年 人工智能AI重点分析 第四章Python的数据类型之数字类型(补充)
查看>>
Wordpress实战之第三章一键安装Wrodpress
查看>>
Wordpress实战之第四章WordPress后台操作方法
查看>>
Wordpress实战之第五章文章内容设置使用介绍
查看>>
Wordpress实战之第六章文章内容设置使用介绍(补充)
查看>>
Wordpress实战之第七章分类目录介绍
查看>>
Wordpress实战之第八章标签的使用概念
查看>>
2021年 人工智能AI重点分析 第五章 Python的数据类型之字符串类型
查看>>
C++实战数据结构与算法-什么是数据结构
查看>>
C++实战数据结构与算法-第2节什么是存储结构
查看>>
C++实战数据结构与算法-第3节什么是数据结构算法
查看>>
C++实战数据结构与算法-第4节线性表的定义
查看>>
C++实战数据结构与算法-第5节实战顺序存储
查看>>
2021年信创系统实战Qt5.9-第一节认识QT中UI的头文件和源文件内容
查看>>
2021年信创系统实战Qt5.9-第二节Qt开发工具使用
查看>>
2021年信创系统实战Qt5.9-第三节实战案例登录功能实现
查看>>
C++实战数据结构与算法-第6节单链表(一)
查看>>
2021年信创系统实战Qt5.9-第四节手动创建登录功能实现
查看>>