linux文本处理三剑客之awk

Posted 黑马金牌编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux文本处理三剑客之awk相关的知识,希望对你有一定的参考价值。


4.1特点与应用场景

awk

一门语言,类似于C语言
过滤,统计,计算
过滤,统计日志

4.2 awk内置变量


内置变量



示例



NR



Number or Record 记录号,行号



NF



Number of Field 每行有多个字段(列) $NF表示最后一列



awk print $NF  文件名



FS



-F:    ===-v FS=:  Field Separator 字段分隔符,每个字段结束标记



OFS



Output Field Separator 输出字段分隔符,(awk显示每一列的时候,每一列之间通过什么分割,默认是空格)



awk -F: -v OFS=: print $NF,$2,$3,$4,$5,$6,$1 文件名


linux文本处理三剑客之awk_字段

linux文本处理三剑客之awk_awk_02

4.3行与列


名词



awk中叫法



一些说明





记录record



每一行默认通过回车分割





字段域field



每一列默认通过空格分割



awk中行和列结束标记都是可以修改的



1)取行


awk



示例



NR==1



取出某一行



awk NR==1 access.log.20220304000301



NR>1&&NR<=5



取出1到5行范围



/oldboy/



/101/,/105/



符号



> < >= <= == !=


2)取列

-F 指定分隔符 指定每一列结束标记(默认是空格,连续的空格,tab键)
$数字 取出某一列,注意:在awk中$内容一个意思 表示取出某一列
$0整行的内容,
print xxx
$NF表示最后一列(示例)
awk print $NF access.log.20220304000301

linux文本处理三剑客之awk_字段_03

linux文本处理三剑客之awk_数组_04

取网卡地址

linux文本处理三剑客之awk_awk_05

linux文本处理三剑客之awk_html_06

只取个ip地址

linux文本处理三剑客之awk_数组_07

linux文本处理三剑客之awk_html_08

3)小结

行与列名称
awk取行与列,指哪打哪
取出网卡ip地址

4.4 swk 模式匹配

谁可以作为awk的条件


awk



-F"/+"



NR==3print $3



命令



选项



条件动作



模式干啥



模式动作



patternaction


linux文本处理三剑客之awk_awk_09

linux文本处理三剑客之awk_数组_10

1)比较表达式-参考上面取行部分

2)正则:

支持扩展正则
awk可以精确到某一列,某一行中包含/不包含.....内容。
~包含
!~不包含


正则



awk正则



^表示以....开头的行



某一列的开头  $3~/^oldoy/



$表示以.....结尾的行



某一列的结尾$4~/lidao$/



^$表示空行



某一列是空的    很少用



#找出  第3列以2开头的行,并显示第1,3和最后一列

linux文本处理三剑客之awk_html_11

linux文本处理三剑客之awk_字段_12

找出  第3列以1或2开头的行,并显示第1列,第3列和最后一列

linux文本处理三剑客之awk_html_13

linux文本处理三剑客之awk_awk_14

还有这几种写法

linux文本处理三剑客之awk_字段_15

linux文本处理三剑客之awk_awk_16

3)表示范围

/哪里开始/,/哪里结束/ 常用
NR==1,NR==5 从第1行开始到第5行结束 类似于sed -n 1,5p


#显示指定时间(11:02:00到11:02:30)范围内容的ip地址和用户访问uri column -t(自动对齐)
awk /11:02:00/,/11:02:30/print $1 access.log.20220304000301
awk /11:02:00/,/11:02:30/print $1,$7,$9,$10 access.log.20220304000301 |column -t

4)特殊模式BEGIN和END


模式



含义



应用场景



BEGIN



里面的内容会在awk读取文件之前执行



1)进行简单统计,计算,不涉及读取文件(常见)

2)用来处理文件之前,添加个表头(了解)

3)用来定义awk变量(很少用,因为可以用-v)



END



里面的内容会在awk读取文件之后执行



1)awk进行统计,一般过程;先进行计算,最后END里面输出结果(常见)

2)awk使用数组,用来输出数组结果。(常见)


  1. END统计计算:
  2. 统计方法


统计方法



简写形式



应用场景


i=i+1


i++



计数,统计次数



sum=sum+???



sum+=???



求和,累加



注意:i,sum都是变量


#统计/etc/services  里面有多少个空行
awk /^$/ /etc/services

linux文本处理三剑客之awk_数组_17

linux文本处理三剑客之awk_html_18

统计有多少空行

awk /^$/i++ENDprint i /etc/services

linux文本处理三剑客之awk_数组_19

linux文本处理三剑客之awk_字段_20

#seq 100 求和1+2+3.。。+100 awk实现
seq 100 |awk sum=sum+$1ENDprint sum

linux文本处理三剑客之awk_awk_21

linux文本处理三剑客之awk_html_22

求和显示过程

seq 100 |awk sum=sum+$1;print sumENDprint sum

linux文本处理三剑客之awk_字段_23

linux文本处理三剑客之awk_awk_24

4.5 awk数组

  1. 统计日志:类似于
  2. 统计次数:统计每个ip出现次数,统计每种状态码出现次数,统计系统中每个用户被gongji的次数,统计gongji者ip出现次数
  3. 累加求和:统计每个ip消耗的流量。


shell数组



awk数组



形式



array[0]=oldboy array[1]=liao



array[0]=oldboy array[1]=liao



使用



echo $array[0] $array[1]



print array[0] array[1]



批量输出数组内容



for i in $array[*]

do

    echo $i

done



for(i in array)

      print array[i]



awk数组专用循环,变量获取到的是数组的下标



#awk中字母  会被识别为变量,如果只是想使用字符串需要使用双引号引起来  
awk BEGINa[0]=oldboy;a[1]=liao; print a[0],a[1]

所以无结果

linux文本处理三剑客之awk_字段_25

linux文本处理三剑客之awk_字段_26

数字和加双引号可以正常显示

linux文本处理三剑客之awk_数组_27

linux文本处理三剑客之awk_字段_28

awk数组专用循环打印

[root@heimajinpai ~]# awk BEGINa[0]=12306;a[1]="liao"; for(i in a) print i 
0
1
[root@heimajinpai ~]# awk BEGINa[0]=12306;a[1]="liao"; for(i in a) print a[i]
12306
liao
[root@heimajinpai ~]# awk BEGINa[0]=12306;a[1]="liao"; for(i in a) print i,a[i]
0 12306
1 liao

linux文本处理三剑客之awk_数组_29

linux文本处理三剑客之awk_awk_30

案例:

http://www.etantian.org/index.html
http://www.etantian.org/1.html
http://post.etantian.org/2.html
http://mp3.etantian.org/3.html
http://www.etantian.org/4.html
http://post.etantian.org/5.html
[root@heimajinpai test]# awk -F"[/]+" print $2 url.txt
www.etantian.org
www.etantian.org
post.etantian.org
mp3.etantian.org
www.etantian.org
post.etantian.org
[root@heimajinpai test]# awk -F"[/.]+" print $2 url.txt
www
www
post
mp3
www
post
[root@heimajinpai test]# awk -F"[/.]+" array[$2]++ENDfor(i in array)print i,array[i] url.txt
www 3(出现的次数)
mp3 1(出现的次数)
post 2(出现的次数)
#array[]++    你要统计什么 [] 里面就是什么(某一列)
awk -F"[/.]+" array[$2]++ENDfor(i in array)print i,array[i] url.txt

linux文本处理三剑客之awk_html_31

linux文本处理三剑客之awk_awk_32

#统计access.log中    每种状态码出现的次数(方式一)
awk array[$10]++ENDfor(i in array)print i,array[i] access.log.20220304000301 |sort -rnk2

linux文本处理三剑客之awk_字段_33

linux文本处理三剑客之awk_html_34

#统计access.log中    每种状态码出现的次数(方式一)
awk $10~/[0-9][0-9][0-9]/array[$10]++ENDfor(i in array)print i,array[i] access.log.20220304000301 |sort -rnk2

linux文本处理三剑客之awk_awk_35

linux文本处理三剑客之awk_html_36

注意:使用awk统计日志,尽量精确匹配。

4.6 for循环

for n in 1 2 3
do
echo $n
done

以上是关于linux文本处理三剑客之awk的主要内容,如果未能解决你的问题,请参考以下文章

Linux文本处理三剑客之awk

Linux——文本处理三剑客之awk

Linux文本处理三剑客之awk

Linux文本处理三剑客之GNU awk的使用

Linux文本处理三剑客之GNU awk的使用

linux文本处理三剑客之awk

(c)2006-2024 SYSTEM All Rights Reserved IT常识