闲话: Linux 从来没有系统的学过,AWK 这个高端的东西更没有系统全面的学过,知道真正项目中遇到的时候才会想着系统的学习一下,今天先写一下AWK的数组使用,网上有很多这样的文章,但是很多地方都没有讲的很细,所以看了半天还是一知半解,今天来细细的分析一下(本人忘心大,所以每次都的写的很细,以便以后能看懂,大牛或者觉得繁琐的请略过。

先简单说明一下awk吧

1. 官方解释AWK

awk :适用程序,一种unix工具
就是一个强大的文本分析工具,相对于grep查找、sed的编辑,awk在对数据分析并生成报告的时候,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种处理。

用法:

1) awk [ -F separator] '{pattern action}'  fileName

或者2)awk [ -F separator] ' pattern {action}'  fileName

2. 个人理解

像一个for循环,逐行读入文件内容(或者管道传输过来的值) ,然后使用分隔符将每行切片(用户可以指定自己想使用的分隔符)

3. AWK数组

因为awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。和Java等数组不一样,Java等数组下表只能是数字。其实这里的数组相当于Java等语言中的Map。 AWK 的下标是关键字。值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。 说了一大堆,如果你没看太懂,你只要记住把awk数组看成是Map就可以

eg:  a[1] =  5 a[2] = 6 其实相当于 map.key = 1 map.value = 5 map.key=2 map.value=6 这也就说是为什么下表可以是数字或者字母。

4. 举例

1)[root@admin home]# cat awk.txt
aaa

bbb

ccc

aaa

bbb

aaa

统计一下awk.txt文件中每个字符串名出现的次数:cat awk.txt | awk '{a[$1]++} END { for (i in a) {print i,a[i]}}'

a[$1]++ : 就是awk  数组的形式,  a 是数组名称, [$1]做为key . 现在我们需要计算每个字符串出现的次数,所以需要把扫描到的相同的字符串名分别存储起来 ,就是键值对的数组,这里的键—对应的就是字符串,如aaa,值 — 对应的就是aaa出现的次数。数组a中的下标$1代表的是第一个域中列名,如aaa。awk开始逐行扫描,相当于for循环,每扫到一个相同的字符串,对应的hash数组里的值就+1,如a[aaa]++,直到扫到文件的结尾。(注:数组的默认值为空,如果要做++操作了,就会把里的值变成0)

awk数组不需要定义,可以直接赋值。

2) 有文件file.log内容如下:

http://www.sohu.com/aaa

http://www.sina.com/111

http://www.sohu.com/bbb

http://www.sina.com/222

http://www.sohu.com/ccc

http://www.163.com/zzz

http://www.sohu.com/ddd

要统每个域名出现次数:

http://www.sohu.com 4

http://www.sina.com 2

http://www.163.com 1

答案是:  awk -F / '{a[$3]++} END{for(i in a){print i,a[i] | "sort -r -k 2"}}' file.log;

-F参数是制定awk分隔符,这里制定的是 /,所以每行被分成4个部分。

sort 的-r是降序,-k是按照第几组字符排序,从1开始。

a可以理解成key-value形式的对象,域名做key 个数做value。

在end动作里完成对结果a的打印

3) awk统计ip访问次数(进阶)
现在有一个文件,数据量大概在200多万条记录,想用shell的awk做统计,文件的格式如下
#关键字#URL#IP地址#
key1|url1|192.80.80.1

key1|url1|192.80.80.1

key1|url2|192.80.80.2
key1|url1|192.80.80.2
key2|url1|192.80.80.1
key2|url2|192.80.80.2
key2|url1|192.80.80.2
现在想要统计的结果是:查看同一个关键字和URL总的访问的次数,以及多少个不同的IP,输出到一个文件中

awk -F"|" '{a[$1" "$2]++;b[$1" "$2" "$3]++}(b[$1" "$2" "$3]==1){++c[$1" "$2]}END{ for (i in a) print i,c[i],a[i]}' file

看起来很复杂,其实分开理解还算简单

有三个值  a[$1" "$2] 很好理解key url为关键字的访问次数。 就是理解为就是key url为关键字的 然后 a[$1" "$2]++ 可以理解为如果以$1" "$2为关键字的。如果存在了就增加1,如果还不存在,就设值为1

那算多少个不同的IP怎么算呢? 单纯的想,做法应该是如果  #关键字#URL#IP地址#  是第一次出现, key url为关键字的访问IP肯定要+1 ,但是如果不是第一次出现,那此IP之前已经计算过了。就不用计算了。翻译为代码就是     (b[$1" "$2" "$3]==1){++c[$1" "$2]}

再看一下:处理方法就是:

依次加载一行(for 循环/awk)  如果以$1" "$2为关键字的。如果存在了就增加1,如果还不存在,就设值为1    a[$1" "$2]++

如果  #关键字#URL#IP地址#  是第一次出现, key url为关键字的访问IP肯定要+1 ,但是如果不是第一次出现,什么都不需要做  {b[$1" "$2" "$3]++}(b[$1" "$2" "$3]==1){++c[$1" "$2]}

现在再看是不是就好理解了,最后结果为:

key2 url2 1 1
key1 url1 2 3
key2 url1 2 2
key1 url2 1 1

Linux-awk数组相关推荐

  1. linux awk数组长度,linux awk数组操作详细介绍

    linux awk数组操作详细介绍 用awk进行文本处理,少不了就是它的数组处理.那么awk数组有那些特点,一般常见运算又会怎么样呢.我们先看下下面的一些介绍,结合例子我 们会讲解下它的不同之处.在 ...

  2. linux数组长度的函数,linux awk数组操作详细介绍

    用awk进行文本处理,少不了就是它的数组处理.那么awk数组有那些特点,一般常见运算又会怎么样呢.我们先看下下面的一些介绍,结合例子我们会讲解下它的不同之处.在 awk 中数组叫做关联数组(assoc ...

  3. linux awk数组使用

    2019独角兽企业重金招聘Python工程师标准>>> 用awk进行文本处理,少不了就是它的数组处理.那么awk数组有那些特点,一般常见运算又会怎么样呢.我们先看下下面的一些介绍,结 ...

  4. linux awk 数组的学习心得

    在文本处理的工作中,awk的数组是必不可少的工具,在这里,同样以总结经验和教训的方式和大家分享下我的一些学习心得,如有错误的地方,请大家指正和补充. awk的数组,一种关联数组(Associative ...

  5. linux awk 数组,shell数组和awk数组

    awk终于能入门了,所以整理了该文章,内容大多来自网上. 一.bash支持一维数组(不支持多维数组),没有限定数组的大小.在shell中,用括号来表示数组,数组元素用空格符号分割开.类似于C语言,数组 ...

  6. Linux --- awk

    这里提到awk,相信写shell的朋友都会接触到.AWK 是一种用于处理文本的编程语言工具.AWK 提供了极其强大的功能: 可以进行正则表达式的匹配 样式装入 流控制 数学运算符 进程控制语句 内置的 ...

  7. awk linux 数组,Linux中的awk数组的基本使用方法

    1.awk数组描述 在其他的编程语言中,数组的下标都是从0开始的,也就是说,如果想反向引用数组中 的第一个元素,则需要引用对应的下标[0],在awk中数组也是通过引用下标的方法,但是在awk中数组的下 ...

  8. linux awk 结果转数组,Linux中的awk数组的基本使用方法

    1.awk数组描述 在其他的编程语言中,数组的下标都是从0开始的,也就是说,如果想反向引用数组中 的第一个元素,则需要引用对应的下标[0],在awk中数组也是通过引用下标的方法,但是在awk中数组的下 ...

  9. Linux三剑客awk数组、判断、循环

    awk数组 数组应用场景 数组的下标可以是任意形式,理解为高级语言的map表即可 统计次数:统计每个用户ip出现的次数,统计每种状态码出现次数,统计系统中每个用户被攻击的次数,统计攻击者ip出现的次数 ...

  10. awk数组命令经典生产实战应用拓展

    全部系列分为五篇文章,本博文为第三篇:四.awk数组命令生产实战拓展4.1统计apache日志单ip访问请求数排名(这个常用,考试也常考) 假设apache日志内容access.log内容为: 10. ...

最新文章

  1. Tornado自定义分布式session框架
  2. 看看人家 SpringBoot 的全局异常处理多么优雅...
  3. 让PHP更快的提供文件下载 【转】
  4. php接收ajax转数组
  5. 【强烈推荐】如何给TortoiseGit 配置密钥?
  6. 跨域问题的前后端解决方案
  7. 一、专栏作者润森闲谈数据分析
  8. iphone备忘录突然没了_苹果突然下架12 天猫:双11有惊喜!iPhone12 mini配色缩水
  9. linux默认归档目录,Linux系统管理(第4章:目录和文件管理二)
  10. 小程序 坚屏_如何构建坚如磐石的应用程序
  11. leetcode 190. 颠倒二进制位
  12. (数据库系统概论|王珊)第九章关系查询与关系优化:习题
  13. 前端代码审查利器:vscode插件GitLab Workflow
  14. [demo] 微信小程序Demo:树芽读书(一个不错的书籍朗读小程序)
  15. 史上最简单,利用Spring-boot快速搭建邮件发送服务!
  16. 在html字符串拼接函数,通过html字符串连接组合并调用javascript函数
  17. python pip安装第三方库出现error: option --single-version-externally-managed not recognized
  18. 在线考试答题刷题小程序
  19. Python整数的溢出问题
  20. 基于工厂智能化改造——数字孪生映射应用案例解析

热门文章

  1. zigbee IAR工程下载与调试
  2. C语言每日一练(五)
  3. golang后台管理系统GoFrame+Vue+ElementUI框架搭建教程
  4. 联想笔记本电脑计算机专业学生,大一计算机专业学生
  5. python中argsort_(学习笔记)numpy中argsort函数用法
  6. argsort()函数的总结
  7. 视频教程-15天入门MySQL和高性能调优视频教程-MySQL
  8. Python数据清洗之List去除空格
  9. 惊雷算法3.0,严厉打击刷点击作弊行为,如何调整?
  10. android adb开启服务,android adb 启动activity、service,发送broadcast等操作