`

linux awk (计数)

awk 
阅读更多

闲话: 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

转自:https://blog.csdn.net/qq_36898043/article/details/79667413

分享到:
评论

相关推荐

    linux awk学习

    ### Linux Awk 学习知识点详解 #### 一、Awk 简介与基本用法 Awk 是一种在 Unix 和类 Unix 操作系统上广泛使用的文本处理工具,能够帮助用户快速处理文本数据,执行复杂的文本分析任务。Awk 的主要功能包括模式...

    Linux AWK 命令

    2. **计数统计**:可以计算满足条件的行数,如`awk '/pattern/ {count++} END {print count}' file`。 3. **算术运算**:AWK支持数学运算,可用于统计平均值、总和等,如`awk '{sum+=$1} END {print sum/NR}' file`...

    Linux AWK内置函数

    ### Linux AWK内置函数详解 #### 一、算术函数 AWK 提供了一系列内置的数学函数,可以方便地处理各种数学运算。 1. **`atan2(y, x)`** - **功能**:计算 y 和 x 的商的反正切值。 - **示例**:`awk 'BEGIN { ...

    LINUX下awk命令详解

    ### Linux 下 awk 命令详解 #### 一、引言 `awk` 是一个功能强大的文本处理工具,在 Unix 和类 Unix 操作系统(如 Linux)中被广泛使用。它不仅可以进行模式匹配,还能执行复杂的文本处理任务。本文将详细介绍 `awk...

    linux awk命令详解.docx

    `awk`中的`$0`表示整行内容,`$1`到`$n`表示按分隔符划分的各个字段,`NF`是字段数量,`NR`是当前处理的行号,`FNR`是在当前文件中的行号(多文件处理时,每个文件从1开始计数)。 `awk`支持多种字符串和正则表达式...

    LINUX的awk和sed的常用用法

    LINUX 的 awk 和 sed 的常用用法 awk 是一种功能强大的文本处理工具,它可以在文件或字符串中基于指定规则浏览和抽取信息。awk 语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息。 调用 awk 有三种...

    linux awk 内置变量使用介绍.docx

    在Linux系统中,awk是一个强大的文本分析工具,它允许用户通过模式匹配和处理来解析和操作数据。awk的内置变量是其灵活性的关键组成部分,这些变量提供了对输入和输出的控制,以及对处理过程的元信息的访问。以下是...

    awk详细用法小结awk awk

    gawk不仅完全兼容标准的awk,还提供了许多增强功能,使其成为Linux系统上查找和使用的首选awk版本。 #### 二、awk命令格式与选项 ##### 2.1 awk命令格式 awk的使用可以通过两种基本方式: - awk [options]'...

    Linux下科学计数法(e)转化为数字的方法

    在Linux环境中,科学计数法是一种常见的数值表示方式,它以`e`或`E`作为指数符号,方便表示较大或较小的数值。本篇文章主要探讨如何将这种形式的数值转换为十进制数,这对于处理数值计算或数据解析特别有用。 科学...

    Linux 中awk 提取包含某个关键字的段落

    这样,awk不仅可以提取出包含关键字的段落,还能提供每个关键字出现的计数。 总之,awk在Linux环境中是一个强大的文本处理工具,能够有效地帮助我们处理和分析文本数据,尤其是在提取特定关键字的段落时。通过熟练...

    awk-培训.docx

    在Linux系统中,awk是一种强大的文本分析工具,尤其在处理数据和日志文件时非常有用。awk其实有多个版本,包括awk、nawk和gawk,而在CentOS系统中默认使用的是gawk。awk的工作原理是对文本文件的每一行进行处理,...

    AWK用法AWK用法AWK用法

    AWK是一种编程语言,专为文本处理设计,尤其适合在Linux或Unix环境中进行数据处理与分析。 ### AWK命令示例解析 #### awk ‘/101/’ file 该命令用于显示文件`file`中包含数字`101`的所有行。这里的`/101/`是正则...

    awk学习资料最近整理的资料

    awk是一种强大的文本分析工具,常用于处理Linux或Unix系统中的结构化数据文件。它通过模式匹配和动作执行来解析和操作文本,对于日志分析、数据提取和转换等任务非常高效。在shell环境中,awk是程序员和系统管理员的...

    grep,sed, awk 总结

    grep适用于简单的搜索和计数任务,sed则更加强大,可以进行文本替换和复杂编辑,而awk则类似于一种简化的编程语言,其在文本处理上提供了极高的灵活性和强大的功能。熟练掌握这三个工具,将大幅提高Linux环境下的...

    awk实现Left、join查询、去除重复值以及局部变量讲解例子

    这种简洁的方法使用 `$1_$2` 作为数组 `a` 的键,如果键不存在,则打印行并为键增加计数,防止重复打印。 ### 局部变量在 awk 中的作用 在 awk 脚本中,可以声明和使用局部变量来存储和处理数据。例如,可以在 `...

    071204awk应用1

    `awk`命令作为Linux下强大的文本处理工具,常常被用来分析日志、监控网络状态等。本篇文章主要探讨了`awk`在Linux Web服务器故障分析和网站日志分析中的应用。 1. **TCP连接状态分析** - `netstat -nat |awk '{...

    awk,sed,grep总结

    在IT行业中,文本处理是日常工作中不可或缺的一部分,而awk、sed和grep是Linux/Unix环境中强大的文本处理工具。这三个工具各自具有独特的功能,但又常常相互配合,为数据过滤、格式化和查找提供了强大支持。下面我们...

    shell script之awk讲解

    awk是一种强大的文本分析工具,常用于处理数据文件,特别是在Unix/Linux环境中。它是一种样式扫描与处理工具,可以方便地从大型文本数据中提取、格式化和操作信息。awk的名字来源于它的三位创始人——Alfred Aho、...

Global site tag (gtag.js) - Google Analytics