AWK处理日志入门(转)
前言
这两天自己挽起袖子处理日志,终于把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
AWK处理日志入门(转)的更多相关文章
- 【转】Linux强大命令 Awk 20分钟入门介绍
什么是Awk Awk是一种小巧的编程语言及命令行工具.(其名称得自于它的创始人Alfred Aho.Peter Weinberger 和 Brian Kernighan姓氏的首个字母).它非常适合服务 ...
- 使用awk进行日志信息的分组统计
起因 这是今天我线上出了一个bug,需要查看日志并统计一个我需要的信息出现的频率,可以叫做分组统计. 日志文件部分内容 00:09:07.655 [showcase_backend][topsdk] ...
- Linux中的 awk查找日志中的相关记录
假设要在 api.log.201707201830 文件中,(此文件的多个字段数据以不可见字符^A(键盘上按下Ctrl+V+A)分隔),要输出第70个字段: awk -F '^A' '{print $ ...
- awk的日志模块追加日期时间字段的方案
function test() { i = ) { system("sleep 1") "date +'%Y-%m-%d %H:%M:%S'" | getlin ...
- awk:快速入门(简单实用19例+鸟哥书内容)
awk 用法:awk ' pattern {action} ' 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 ...
- spring boot中的日志入门
日志通常不会在需求阶段作为一个功能单独提出来,也不会在产品方案中看到它的细节.但是,这丝毫不影响它在任何一个系统中的重要地位. 报警系统与日志系统的关系 为了保证服务的高可用,发现问题一定要及时,定位 ...
- awk 命令使用入门
Linux 下处理和分析文本文件内容,AWK 命令是一个强有力的工具.特别是文件内容是以行和列的形式排版的时候,AWK 就是命令行界的 Excel 啊! 简单的 awk 命令可以直接在命令行中使用,复 ...
- logback日志入门超级详细讲解
基本信息 日志:就是能够准确无误地把系统在运行状态中所发生的情况描述出来(连接超时.用户操作.异常抛出等等): 日志框架:就是集成能够将日志信息统一规范后输出的工具包. Logback优势 Logba ...
- Java日志 #01# 入门
很多人在学习完一个东西之后就会忘掉自己作为初学者时的体验.. 例如刚接触git的时候自己也是一头雾水,然后别人问起来,老是会说:xxxx#!@#,就是这么回事儿,有什么不好懂的. 其实从不懂到懂,再到 ...
随机推荐
- PMP项目管理笔记 项目定义
项目的定义 项目是为创造独特的产品,服务或成果而进行临时性的工作. 项目是组织的经营需要与战略目标服务的. PMBOK 指南描述的项目管理知识,从本质上讲,是用来管理中等或以上规模,跨部门,跨专业的目 ...
- ruby开源项目之Octopress:像黑客一样写博客(zhuan)
ruby开源项目之Octopress:像黑客一样写博客 百度权重查询 词库网 网站监控 服务器监控 SEO监控 Swift编程语言教程 今年一直推荐的一种写作方式.markdown语法快速成文,git ...
- tab切换类
/* * 传入id和点击时的回调函数,可以传第三个参数,就是当前tab的类名默认tabon * 主要完成tab的外观,就是当前tab的切换,完成外观切换后,会调用传入的回调函数 */ function ...
- 青蛙的烦恼(dp好题)
有n片荷叶正好在一凸多边形顶点上 有一只小青蛙恰好站在1号荷叶的点 小青蛙可以从一片荷叶上跳到另外任意一片荷叶上 给出N个点的坐标N<800 求小青蛙想通过最短的路程遍历所有的荷叶一次且仅一次的 ...
- NOIP2005 篝火晚会 解题报告
佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1到n.一开始,同学们按照1,2,… ...
- ubuntu 14.04 安装截图工具 Shutter及使用
一.安装截图工具 Shutter 1. 添加安装包软件源 sudo add-apt-repository ppa:shutter/ppa 1 2. 更新源并安装 shutter sudo apt-ge ...
- [开发笔记]-FireWorks常用操作快捷键
一.工具快捷键 指针.选择后方对象[V],[0] 部分选定[A],[1] 选取框.椭圆选取框[M] 套索.多边形套索[L] 裁剪.导出区域[C] 魔术棒[W] 线条工具[N] 钢笔工具[P] 矩形.圆 ...
- 踏着前人的脚印学Hadoop——序列化,Writerable
package org.apache.hadoop.io; import java.io.DataOutput;import java.io.DataInput;import java.io.IOEx ...
- Linux摄像头驱动学习之:(一)V4L2_框架分析
这段时间开始搞安卓camera底层驱动了,把以前的的Linux视频驱动回顾一下,本篇主要概述一下vfl2(video for linux 2). 一. V4L2框架: video for linux ...
- Android ViewPager 里有子ViewPager的事件冲突
在Android应用中有时候要用到类似网易新闻左右滑动页面且页面里又有左右滑动的图片功能,我不知道网易是怎么实现的,本人的做法是外面的BaseFragmentActivity布局就是TabViewPa ...