前言

这两天自己挽起袖子处理日志,终于把AWK给入门了。其实AWK的基本使用,学起来也就半天的时间,之前总是靠同事代劳,惰性呀。

此文仅为菜鸟入门,运维们请勿围观。

下面是被处理的日志的示例,不那么标准,但不标准的日志正是标准的情况。

[2015-08-20 10:00:55.600] - [192.168.0.73/192.168.0.75:1080 com.vip.xxx.MyService_2.0 0 106046 100346 90ms 110ms]

基本语句

最基本的语句,以空格做分割,提取所需的列:

awk '{print $0,$1,$2,$(NF-1),$NF,$NF-$(NF-1)}’ access.log

1. 输入

AWK是针对文件或管道中每行输入的处理语言。所以也可以从管道输入:

grep “xxx” access.log | awk '{print $1}’

但下面这样写就会成为一个Linux老梗的主角,awk不需要不需要cat的。

cat access.log | awk '{print $1}'

2.语句定义

可以快速的用单引号’ ’,把所有语句写成一行。

也可以用-f 指定文件,文件里可以任意换行,增加可读性和重用性。

所有执行语句用{}括起来,{}的外面是一些高级的东西比如过滤条件,见后。

3. 列引用

$0代表整行所有数据,$1代表第一列(终于不是程序员数数从0开始了)。

NF是个代表总列数的系统变量,所以$NF代表最后一列,还支持$(NF-1)来表示倒数第二列。

还支持列之间的运算,如$NF-$(NF-1)是最后两列的值相减。

只写一个print 是 print $0的简写,打印整行所有数据。

4. 输入的列分隔符

默认以空格做分割符,也可以重新指定,下例指定了':'

awk -F ':' '{print $1,$2}’ access.log

也可以正则表达式定义多个分割符,下例指定了 '-' 和 ':'

awk -F '[-:]' '{print $1,$2}’ access.log

5. 输出的列间隔

print $1,$2 中间的','逗号,代表打印时第1与第2列之间使用默认分隔符号也就是空格,也可以用” ”来定义其他任意的字符:

awk '{print $1 "\t" $2 " - " $3$4xxxxx$5}’ access.log

上例,在第1第2列之间用 tab 分隔,第2第3列之间用" - "分隔,

也可以什么都不写代表中间没分隔,比如第3第4列之间,或者乱写一些字符没用" "括起来,也等于没写,比如第4第5列之间。

数字类型,字符串类型

虽然上例最后两列的值是字符串类型的,带着ms字样,看起来不能做算术运算。

但其实两个列相减时,AWK就会神奇地把它们转换为纯数字。同样,做累计的时候,sum=sum+$NF,也能自动转换为数字。

如果想对某个字符列比较是否大于阀值,先把它转回数字就行了,上一篇文章里的

sed "s|ms]||g" access.log | awk ' $NF>100 {print}'

其实可以简写成下面的样子,性能还比使用sed略快:

awk ' $NF*1>100 {print}’ access.log

awk ' int($NF)>100 {print}’ access.log

BEGIN与END语句

BEGIN与END后的语句定义在处理全部文本内容之前与之后的语句。

1.计算累计值和平均值

awk '{sum+=$NF} END {print sum, sum/NR}'

上例对每行输入内容进行最后一列的值的累计,而END后的语句,打印累计结果 和平均值,NR是系统变量代表总行数。

2.打印表头

还可以定义BEGIN语句打印表头,定义变量什么的。

awk 'BEGIN{print "Date\t\tTime\t\tCost”} {print $1 "\t"$2 "\t" $NF}’ access.log

上例表头用两个制表符分隔,内容则用一个制表符分隔,有良好的对齐效果。

过滤行

1. 简单字符匹配

先用grep过滤也是可以的,也可以用awk简单在执行语句之外的/ /之间定义正则表达式

awk '/192.168.0.4[1-5]/ {print $1}’ access.log

等价于

grep "192.168.0.4[1-5]” access.log| awk ‘{print $1}

2. 针对某一列的字符匹配

针对第4列的地址段匹配,~ 是字符匹配,!~则是不匹配的意思。

awk '$4 ~ /192.168.0.4[1-5]/ {print}'

3. 针对数值的过滤

支持==, !=, <, >, <=, >=

awk '$(NF-1)*1==100 {print}'

awk '$NF-$(NF-1)>100 {print}'

见前,对于非纯数字的字段,可以用算术运算让它转回数字。

4. 多条件同时存在

awk '($12 >150 || $(13)>250) {print}'

5. 使用if语句

如果逻辑更复杂,可以考虑使用if,else等语句

awk '{ if ($(NF-1)*1>100) print}'

其他

1.外部传入参数

比如从外面传入超时的阀值,注意threshold在命令行中的位置。

awk '{if($(NF)*1>threshold) print}' threshold=20 access.log

2.常用函数

最有用是gsub和sub,match,index等。其中gsub将一个字符串替换为目标字符串,可选定整行替换或只替换某一列。

awk '{gsub("ms]","",$NF); if( $NF>100 ) print}' access.log

一些例子

1.截取日期段内段数据

方式有很多,都是随着日志格式不同自由发挥。

比如下段截取17:30:30 秒到 17.31:00的数据,先抽取出时分秒三列,再拼成一个数字进行比较

awk -F "[ :.]" '$2$3$4>=173030 && $2$3$4<173100 {print}'

也可以匹配某个整点时间, 下例取11点的日志:

awk '/[2015-08-20 11:/ {print $1}’ access.log

取11点01分到05分的数据:

awk '/[2015-08-20 11:0[1-5]:/ {print $1}’ access.log

2. 找出超时的数据集中发生的时间

第一段找出超时记录,第二段过滤掉时间戳里的微秒,然后按秒来合并,并统计该秒超时的次数。

awk '$(NF)*1>100 {print}’ access.log | awk -F"." '{print $1}' | sort | uniq -c

原文地址:http://calvin1978.blogcn.com/articles/awk_accesslog.html

转载于:https://www.cnblogs.com/rainy-shurun/p/5426541.html

AWK处理日志入门(转)相关推荐

  1. Linux中的 awk查找日志中的相关记录

    假设要在 api.log.201707201830 文件中,(此文件的多个字段数据以不可见字符^A(键盘上按下Ctrl+V+A)分隔),要输出第70个字段: awk -F '^A' '{print $ ...

  2. shell中用grep查找并且不输出_grep awk 搜索日志常用命令

    0 grep 常用参数 --color:高亮显示匹配到的字符串 -v:显示不能被pattern匹配到的 -i:忽略字符大小写 -o:仅显示匹配到的字符串 -q:静默模式,不输出任何信息 -A#:aft ...

  3. linux awk 时间范围,如何用awk从日志文件中找到时间范围的记录

    日志格式如下 2013/08/16    01:10:11.111    E12345678900-0    6513    123    0    IN    OK()    0    0    0 ...

  4. 运用awk提取日志文件中的IP地址

    在我们的日常工作中,可能会遇到各种不同的问题,有来自内部,有的来自外部. 以Nginx服务为例,服务上线之后可能会遭受非法的流量攻击,我们在配置Nginx服务时可以通过Nginx.conf配置文件中的 ...

  5. linux awk nginx日志分析,awk分析nginx日志中的网页响应时间

    nginx日志可以十分方便的看到每一个请求的响应速度,通常我会用awk去分析这些请求耗时.通常nginx的log配置是这样的 log_format access_comment '$remote_ad ...

  6. Awk 20 分钟入门介绍

    什么是Awk Awk是一种小巧的编程语言及命令行工具.(其名称得自于它的创始人Alfred Aho.Peter Weinberger 和 Brian Kernighan姓氏的首个字母).它非常适合服务 ...

  7. 阿里云日志下载以及awk处理日志巧计

    我们可以下载阿里云日志,命令如下:可以先阅读:https://aliyun-log-cli.readthedocs.io/en/latest/README_CN.html?spm=5176.20205 ...

  8. 利用 Linux grep 和 awk 完成日志过滤

    导语:有时候系统的日志信息的量是很庞大的,这时要查看具体问题可能比较麻烦.此时可以过滤掉无用的日志信息,从而获取预期想获取的信息.或者在排查问题时,查看具体的某一个错误. Linux grep 命令用 ...

  9. spring boot中的日志入门

    日志通常不会在需求阶段作为一个功能单独提出来,也不会在产品方案中看到它的细节.但是,这丝毫不影响它在任何一个系统中的重要地位. 报警系统与日志系统的关系 为了保证服务的高可用,发现问题一定要及时,定位 ...

最新文章

  1. Nature大调查显示 :全球1/4博士生想换导师
  2. C/C++中调用api设置mysql连接的编码方式
  3. Linux/Unix 新手和专家教程
  4. 图解Kafka中的基本概念
  5. Raki的读paper小记:DEBERTA: DECODING-ENHANCED BERT WITH DISENTANGLED ATTENTION
  6. 美股,期货和国债随着大选进行中持续大幅度波动,华尔街如何看待这次结局?
  7. Information Bottleneck 信息瓶颈
  8. 拉姆达表达式/Lambda表达式/lambda expression 使用整理
  9. python 探索性分析_python中的探索性文本分析
  10. VR全景有什么应用,和传统摄影的区别,发展前景如何?
  11. ih5学习笔记_事件对象
  12. 清华大学交叉信息研究院姚班修改培养模式:姚班、智班、量信班全合并
  13. commit节点号 git_Git调整commit之间顺序
  14. webstorm 安装激活破解方法
  15. 用matlab实现用Bp神经网络对iris数据集进行分类(以及影响分类性能的参数条件)
  16. 如何实现‘请在微信客户端打开链接’
  17. TikTok不可思议的崛起
  18. MySQL 8.0 新特性之检查约束(CHECK)
  19. 苹果庆祝 7 月17 日 Emoji 世界表情符号日,带来众多新表情
  20. 命令注入-命令的连接符【‘’‘’‘||’‘|’】的含义及其用法

热门文章

  1. 枚举+贪心--经常用到的思路--过程不好弄是--枚举结果C. Elections
  2. jQuery基础简介
  3. 操作系统—多生产者多消费者问题
  4. SQL面试题(16 - 25)oracle写的
  5. C++11常见新特性
  6. 求连续区间和为目标值的一种解题思路
  7. Unity3D基础29:消息发送
  8. bzoj 3361: [Usaco2004 Jan]培根距离
  9. nlogn最长单调递增
  10. 莫烦python学习笔记之tuple,list,字典