awk编程之数组、控制流(长期更新)

数组篇:

数组格式    array[index]=value

 

 

统计nginx的access.log日志中访问最多的10个IP

101.121.182.144 - - [24/Jan/2017:11:25:59 +0800] "POST /home/activity/new-cow-interface!returnNewCowMsg.action HTTP/1.1" 200 2 -uin=50863819- "-" "Java/1.6.0_33" "-""-" "0.067"

awk数组方法实现:

[[email protected] test]# awk ‘{++a[$1]} END{for(i in a)print a[i] "\t" i|"sort -nr|head -10"}‘ access.log

其他方法实现:

[[email protected] test]# awk ‘{print $1}‘ access.log |sort|uniq -c|sort -nr|head -10

 

统计访问状态码为404的IP以及出现次数

[[email protected] test]# awk ‘{if($9~/404/)a[$1" "$9]++}END{for(i in a)print i,a[i]}‘ access.log

 

 

 

 

 

data:

name    id  salary  department  

liu     11  8000    yunweibu

zhang   01  8800    renshibu

li      03  7000    kefubu

wang    02  12000   kaifabu

yu      88  7900    yunweibu

song    19  20000   kaifabu

xue     07  6500    shichangbu

dong    11  11000   kaifabu

li      13  9900    chichangbu

 

 

awk的if用法(如果不是开发部就打印,否则输出none)

[[email protected] test]# awk ‘{if($4!~/kaifabu/){print $0}else{print "none"}}‘ date

 

awk的for的用法,打印1到10

[[email protected] test]# echo |awk ‘{for(i=1;i<=10;i++){print i}}‘

 

用for打印乘法口诀:

echo |awk ‘{for(n=0;n++<9;){for(i=0;i++<n;)printf i"x"n"="i*n" ";print}}‘

 

删除指定行:

方法一:[[email protected] test]# awk ‘NR==1{next}{print}‘ date

方法二:[[email protected] test]# awk ‘NR!=1{print}‘ date

 

用awk查找name是li的行,匹配1次就停止。

[[email protected] test]# awk ‘$1~/li/&&!a++{print}‘ data

 

删除第一列重复的行(只打印第一个匹配到的)

[[email protected] test]# awk ‘!a[$1]++‘ data

 

打印奇数行

方法一:awk ‘i=!i‘

方法二:awk ‘{if(NR%2==1){print}}‘      (依次类推可以打印任意步长)

其他方法:sed -n ‘1~2 p‘      (第一行开始,步长是2)

打印偶数行

awk ‘!(i=!i)‘

解释:i没有被定义,默认值为空字符串或者是0,打印奇数行开始时候i=!0,0是假,!0是真,i=1条件为真,所有会打印,该模式判断为真默认会打印整行记录,所以不加print也会打印。

 

 

匹配第四列重复出现的次数

[[email protected] test]# awk ‘{a[$4]++}END{for(i in a)print a[i] "\t" i}‘ data

 

除了第三列不打印

[[email protected] test]# awk ‘{$1="";print}‘ data

 

打印倒数第二列

[[email protected] test]# awk ‘{print $(NF-1)}‘ data

 

第二列匹配数字的行,如果取反,则$2!~/[0-9]/

[[email protected] test]# awk ‘$2~/[0-9]/ {print $0}‘ data

 

第一列匹配到某个字符串

[[email protected] test]# awk ‘$1~/an/ {print $0}‘ data

 

统计全文单词出现次数,本题是针对 li  如果是 liu 不算

[[email protected] test]# awk ‘{for(i=1;i<=NF;i++)if($i=="li")++sum}END{print sum}‘ data

 

如果要让liu也算,则

[[email protected] test]# awk -F‘li‘ ‘{a+=NF-1}END{print a}‘ data   

 

随机生成6位数

[[email protected] test]# echo | awk ‘BEGIN{srand();print rand()*1000000}‘

 

求第三列的最大值

[[email protected] test]# awk ‘BEGIN{mxa=0}{if($3+0>max+0)max=$3}END{print "MAX=",max}‘ data

 

求第三列的最小值(如果是针对上面的文本,需要先过滤出数字)

[[email protected] test]# awk ‘BEGIN {min = 65536} {if ($3+0 < min+0) min=$3} END {print "Min=", min}‘ data

 

第三列的求和

[[email protected] test]# awk ‘{sum+=$3}END{print sum}‘ data

 

第三列求平均值(前提也是需要先过滤出第三列带数字的)

[[email protected] test]# awk ‘{sum+=$3}END{print sum/NR}‘ data

 

 

 

 

文件合并处理

 

找出a.txt和b.txt两个文件相同的行

[[email protected] test]# cat a.txt

a

b

c

[[email protected] test]# cat b.txt

1

a

2

3

 

[[email protected] test]# awk ‘FNR==NR{a[$0];next}($0 in a)‘ a.txt b.txt

a

解释:合并文件后,NR会依次记录行数,而FNR会在第二个文件进入后重新编对行号,处理文件a.txt时候FNR==NR,条件为真,会执行a[$0];next,next是continue的意思,会继续判断FNR==NR,直到处理文件b.txt时,FNR==NR条件为假执行($0 in a),这句话的意思是,处理文件b.txt时候,如果该行在a里面,则打印,否则不打印。或者这样更好理解:

awk ‘NR==FNR{a[$0]}NR>FNR{if($0 in a)print $0}‘  a.txt b.txt

 

其他方法:[[email protected] test]# grep -f a.txt b.txt

 

 

找不同的行:

[[email protected] test]# awk ‘FNR==NR{a[$0];next}!($0 in a)‘ a.txt b.txt

 

 

合并文件,将b.txt的第二列增加到a.txt中去,名字相互对应(此题有BUG,待更新)

[[email protected] test]# cat a.txt

zhang100

li200

wang 300

[[email protected] test]# cat b.txt

zhang man

liwomen

[[email protected] test]# awk ‘FNR==NR{a[$1]=$0;next}{print a[$1],$2}‘  a.txt b.txt

zhang100 man

li200 women

解释:如果FNR==NR,a[zhang]=a.txt文件中的行,否则打印。

用paste合并文件,然后再进行打印兴许会更好:

[[email protected] test]# paste a.txt b.txt |awk ‘{if($1==$3)print $1"\t"$2"\t"$4}‘

zhang 100 man

li 200 women

时间: 2024-10-10 06:54:02

awk编程之数组、控制流(长期更新)的相关文章

第十九章 文本处理流编辑器:awk编程

第十九章 文本处理流编辑器:awk编程 名词解释 awk 是一种编程语言,用于linux/unix下对文本和数据进行处理.数据可以来自标准输入(stdin).一个或多个文件.或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大个编程工具.它在命令行中使用,但更多是作为脚本来使用.awk有很多内建的功能,比如:数组.函数等,这是它和C语言的相同之处,灵活性是awk最大的优势. awk命令格式和选项 语法形式 awk [option] 'script'

代码优化(长期更新)

前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了.代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨:但是如果有足够的时间开发.维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的. 代码优化的目标是:

Java代码优化(长期更新)

前言 2016年3月修改,结合自己的工作和平时学习的体验重新谈一下为什么要进行代码优化.在修改之前,我的说法是这样的: 就像鲸鱼吃虾米一样,也许吃一个两个虾米对于鲸鱼来说作用不大,但是吃的虾米多了,鲸鱼自然饱了. 代码优化一样,也许一个两个的优化,对于提升代码的运行效率意义不大,但是只要处处都能注意代码优化,总体来说对于提升代码的运行效率就很有用了. 这个观点,在现在看来,是要进行代码优化的一个原因,但不全对.在机械工艺发展的 今天,服务器动辄8核.16核,64位CPU,代码执行效率非常高,St

第四章 shell学习之sed命令和awk编程

sed命令 sed只是对缓冲区中原始文件的副本进行编辑,不改变源文件,所以要保存则要重定向到另一个文件 sed三种方式: 1.sed [选项] 'sed命令' 输入文件 2.sed [选项] -f sed脚本文件 输入文件 3../sed脚本文件 输入文件 其中3的sed脚本文件要以#! bin/sed -f等开头 选项: -n 不打印所有行到标准输出,默认先打印匹配的再打印所有 -e 关联多个sed命令 -f 调用sed脚本文件 定位文本: x x为指定行号 x,y 从x到y行 /patter

《C专家编程》数组和指针并不同--多维数组

<C专家编程>数组和指针并不同 标签(空格分隔): 程序设计论著笔记 1. 背景理解 1.1 区分定义与声明 p83 声明相当于普通声明:它所说明的并非自身,而是描述其他地方创建的对象,声明可以多次出现: 定义相当于特殊声明:它可以为对象分配内存,只能出现在一个地方. 1.2 数组和指针的访问方式 左值和右值 ???????? X = Y ; 符号X的含义是X所代表的地址,这被称为左值,左值在编译时可知,左值表示存储结果的地方. 符号Y的含义是Y所代表的地址的内容,这被称为右值,右值直到运行时

Linux Shell常用技巧(五) awk编程

Linux Shell常用技巧(五) awk编程 十一.  awk编程:    1.  变量:    在awk中变量无须定义即可使用,变量在赋值时即已经完成了定义.变量的类型可以是数字.字符串.根据使用的不同,未初始化变量的值为0或空白字符串" ",这主要取决于变量应用的上下文.下面为变量的赋值负号列表: 符号 含义 等价形式 = a = 5 a = 5 += a = a + 5 a += 5 -= a = a - 5 a -= 5 *= a = a * 5 a *= 5 /= a =

[原创][FPGA]Quartus实用小技巧(长期更新)

0. 简介 在使用Quartus软件时,经常会时不时的发现一些小技巧,本文的目的是总结所查阅或者发现到的小技巧,本文长期更新. 1. Quartus中的模板功能 最近在Quartus II的菜单里找到了一个好去处:language template. 在Edit -> Insert Template下可以看到Verilog HDL.SystemVerilog.VHDL.AHDL.Quartus II TCL.TCL的语言模板. 在Verilog HDL下面,可以找到基本的逻辑操作符.基本语言结构

全网最佳CY7C68013A开发板,USB2.0高速核心板,独家最全开发资料,长期更新支持

铺天盖地的USB开发板.USB核心板那款最适合您?IFLabs组织专业团队.不惜成本.耗费大量时间精力打造的精品USB核心板是您最佳的选择,优化的核心板结构.全网最全的开发手册.全面的配件,一套在手即可开展USB接口的开发.只需这一次投入,即可实现USB接口开发的从入门到精通! 史无前例的专业.可靠.全面.豪华,绝不是其他低价产品所能比的.无论你是初学者,还是具有USB开发基础的工程师都值得拥有. IFLabs USB2.0 FX2LP核心板开发板详情:http://item.taobao.co

linux awk命令详解 --awk编程

简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理. awk有3个不同版本: awk.nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本. awk其名称得自于它的创始人 Alfred Aho .Peter Weinberger 和 Brian Kernighan 姓氏的首个字母.实际上 AWK