time awk '{a[$1]++}END{for(i in a){printf("%d\t%s\n",a[i],i)}}' access.log | sort -nr | head -5

$ cat aa
00:01
00:01
00:01
00:02
00:03
00:05
00:05
00:05
00:05

$ cat aa |awk '{a[$1]+=1;}END{for(i in a){print a[i]" "i;}}'
3 00:01
1 00:02
1 00:03
4 00:05

1. 什么是awk
awk是Unix/Linux提供的样式扫描与处理工具,非常擅长处理结构化数据和生成表单。与sed 和grep 很相似,但功能却超过大于两者,由于awk具备各种脚本语言的特点,所以也可以把它看做一种脚本语言。本文介绍了awk的使用方法。
2. awk程序设计模型
awk程序由三部分组成,分别为:初始化(处理输入前做的准备,放在BEGIN中),数据处理(处理输入数据),收尾处理(处理输入完成后要进行的处理,放到END块中)。其中,在“数据处理”过程中,指令被写成一系列模式/动作过程,模式是用于测试输入行的规则,以确定是否将应用于这些输入行。
3. awk调用方式
主要有三种调用方式,分别为:
(1) awk 命令行
你可以象使用普通UNIX 命令一样使用awk,在命令行中你也可以使用awk 程序设计语言,,这种方法一般只用于解决简单的问题。当然,你也可以在shell script 程序中引用awk 命令行甚至awk 程序脚本。
(2) 使用-f 选项调用awk 程序
awk 允许将一段awk 程序写入一个文本文件,然后在awk 命令行中用-f 选项调用并执行这段程序。
(3) 利用命令解释器调用awk 程序
利用UNIX 支持的命令解释器功能,我们可以将一段awk 程序写入文本文件,然后在它的第一行加上#!/bin/awk –f.
4. awk语法
与其它 UNIX 命令一样,awk 拥有自己的语法:
awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...]
(1) -F re:允许awk 更改其字段分隔符。
(2) parameter:该参数帮助为不同的变量赋值。
(3) ‘prog’:awk 的程序语句段。这个语句段必须用单拓号:’和’括起,以防被shell 解释。这个程序语句段的标准形式为:’pattern {action}’
其中pattern 参数可以是egrep 正则表达式中的任何一个,它可以使用语法/re/再加上一些样式匹配技巧构成。与sed 类似,你也可以使用”,”分开两样式以选择某个范围。action 参数总是被大括号包围,它由一系列awk 语句组成,各语句之间用”;”分隔。awk 解释它们,并在pattern 给定的样式匹配的记录上执行其操作。你可以省略pattern 和action 之一,但不能两者同时省略,当省略pattern 时没有样式匹配,表示对所有行(记录)均执行操作,省略action时执行缺省的操作——在标准输出上显示。
(4) -f progfile:允许awk 调用并执行progfile 指定有程序文件。progfile 是一个文本文件,它必须符合awk 的语法。
(5) in_file:awk的输入文件,awk 允许对多个输入文件进行处理。值得注意的是awk 不修改输入文件。如果未指定输入文件,awk 将接受标准输入,并将结果显示在标准输出上。
5. awk脚本编写
5.1 awk的内置变量
awk中有两类内置的变量,一类用户可根据需要改变,主要有:FS:输入数据的字段分割符,RS:输入数据的记录分隔符,OFS:输输出数据的字段分割符,ORS:输出数据的记录分隔符;另一类是系统自动改变的,如:NF:当前记录的字段个数,NR:当前记录编号等。
举例说明:
awk -F”:” ‘{ print $1 ” ” $3 }’ /etc/passwd #打印passwd中的第1,3个字段
5.2 pattern/action模式
awk程序部分采用了pattern/action模式,即,针对匹配pattern的数据,使用action逻辑进行处理。
举例说明:
/^$/ {print “This is a blank line!”} #判断当前是不是空格
$5 ~ /MA/ {print $1 “,” $3} #判断第5个字段是不是含有“MA”
NF == 3 { print “this particular record has three fields: ” $0 }
5.3 BEGIN和 END
在 awk中两个特别的表达式,BEGIN和 END,这两者都可用于 pattern中,提供 BEGIN 和 END 的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作。任何在 BEGIN 之后列出的操作(在{}内)将在 awk 开始扫描输入之前执行,而 END 之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来初始化变量,使用END 来输出最终结果。
例:累计销售文件xs 中的销售金额(假设销售金额在记录的第三字段) :
$awk
>BEGIN { FS=”:”;print “统计销售金额”;total=0}
>{print $3;total=total+$3;}
>END {printf “销售金额总计:%.2f”,total} sx

shell 统计 awk的更多相关文章

  1. AWK增强的文本处理shell特征--AWK完全手册

    AWK这是一个很好的文字处理工具. 它不仅 Linux 中也是不论什么环境中现有的功能最强大的数据处理引擎之中的一个. 本文主要摘录池中龙写的Unixawk使用手冊(第二版),对当中内容略微修改.感谢 ...

  2. 用shell统计访问日志里每个ip访问次数【转】

    今天,要统计一个系统的每个ip访问次数,于是我找到该系统访问日志,并写脚本实现.   访问日志情况: [root@qular ~]# cd /usr/local/nginx/logs/ [root@q ...

  3. Shell 学习—AWK介绍

    Shell 学习—AWK = = = 安装awk root@kiki-desktop:~/shell# apt-get install gawk gawk-doc = = = awk 是一种程序语言. ...

  4. Shell之awk

    Shell之awk 目录 Shell之awk 一.awk概述 1. awk的工作原理 2. 命令格式 3. awk常见的内建变量(可直接用) 二.操作实例 1. 按行输出文本 2. 按字段输出文本 3 ...

  5. [shell基础]——awk命令

    关于awk awk是一个强大的文本分析工具,相对于grep的查找.sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大. 简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开 ...

  6. CU社区shell板块awk十三问整理

    CU社区shell板块awk十三问整理 一.RS="" 当 RS="" 时,会将\n强制加入到FS变量中,因为RS为空时,是将连续多空行作为分隔符,近似于\n\ ...

  7. linux shell 统计当前目录下的文件个数

    shell 统计当前目录下文件个数,使用管道组合命令: ls -1 | wc -l 解释: ls -1 表示一行一个列出文件名. wc -l 表示打印统计的行数. 两个命令通过管道连在一起表示打印列出 ...

  8. shell 统计GMT0 时区的数据

    和某个供应商核对数据,对方是GMT+0时区,我方报表默认北京时间,无法修改为GMT0, 对excel中按照小时级别的数据导出到excel处理,然后转为文本文件,shell转为GMT0进行统计: 前期处 ...

  9. shell中awk用法

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

随机推荐

  1. 【转】C#综合揭秘——通过修改注册表建立Windows自定义协议

    引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对 ...

  2. (委托事件处理)关于多线程执行显示进度条的实例(转)&&线程间操作无效: 从不是创建控件“rtxtEntryNO”的线程访问它。

    关于多线程执行显示进度条的实例! 之前回答了一篇关于怎么在线程中操作进度条的帖子,估计有人看的不是很明白今天没事,写了一个小小的实例,很简单,就2个文件权当抛砖引玉,希望有更好解决方案的人发表一下意见 ...

  3. js正则及常用方法函数总结

    正则表达式作为一种匹配处理字符串的利器在很多语言中都得到了广泛实现和应用,web开发本质上是处理字符串(服务端接受请求处理后拼接字符串作为响应,这在早期的CGI编程中最明显,然后客户端解析字符串进行渲 ...

  4. samba配置只读共享

    编辑smb.conf 1.在[global]中 找到 security = 将其改为 security = share 2. 在文件中加入自定义的共享目录 [attachment] path=/dat ...

  5. 转:vs发布window应用程序时出错:未能签名 ...\setup.exe

      在vs发布window应用程序过程中,提示“SignTool 报告了一个错误‘未能签名 ...\setup.exe.SignTool 错误: ISignCode::Sign 返回的错误: 0x80 ...

  6. C#的浅拷贝和深拷贝

    C#中有两种类型变量,一种 是值类型变量,一种是引用类型变量 对于值类型变量,深拷贝和前拷贝都是通过赋值操作符号(=)实现,其效果一致,将对象中的值类型的字段拷贝到新的对象中.这个很容易理解. 本文重 ...

  7. Spring3.0.6定时任务task:scheduled

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  8. javassist AOP

    对于AOP,这个概念,不用解释,主要用途很多,我这里主要是为了后续研究如何实现APM做准备.前面研究了动态代理实现AOP,考虑到性能的问题,改用javassist直接修改直接码实现! javassis ...

  9. 【shell】多命令执行顺序

    :举例[root@andon ~]# date;dd if=/dev/zero of=/home/1 bs=1k count=10240;date ##统计dd命令消耗时间,其中/dev/zero为空 ...

  10. Objective-C中nil与release的区别与用法

    首先说一下他们两的作用,nil就是把一个对象的指针置为空,只是切断了指针与内存中对象的联系,它对内存的释放没有什么作用:而release才是真正用于内存释放的,release后系统会将该块内存标记为可 ...