awk使用
awk是什么?
AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识。awk经过改进生成的新的版本nawk,gawk,现在默认linux系统下日常使用的是gawk。
awk用法:
awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
第一步:运行BEGIN{ commands }语句块中的语句。
第二步:从文件或标准输入(stdin)读取一行。然后运行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行反复这个过程。直到文件所有被读取完成。
第三步:当读至输入流末尾时。运行END{ commands }语句块。
BEGIN语句块在awk開始从输入流中读取行之前被运行,这是一个可选的语句块,比方变量初始化、打印输出表格的表头等语句通常能够写在BEGIN语句块中。
END语句块在awk从输入流中读取全然部的行之后即被运行。比方打印全部行的分析结果这类信息汇总都是在END语句块中完毕,它也是一个可选语句块。
pattern语句块中的通用命令是最重要的部分,它也是可选的。假设没有提供pattern语句块,则默认运行{ print },即打印每个读取到的行。awk读取的每一行都会运行该语句块。
这三个部分缺少任何一部分都可以。
内置变量:
- $0 当前行记录(存放整行内容)
- 1 1~ 1 n 当前行的第n列字段,字段由FS分割
- FS 输入字段分隔符,默认是空格或Tab
- NF 当前行记录中的字段个数,就是有多少列
- NR 已经读出的行记录数(行数),从1开始,如果有多个文件话,这个值也是不断累加中。
- FNR 当前行记录数(行数),与NR不同,这个值是各个文件自己的行号
- RS 输入的记录分隔符, 默认为换行符
- OFS 输出字段分隔符,默认也是空格
- ORS 输出的记录分隔符,默认为换行符
- FILENAME 当前输入文件的名字
例如:
[root@vm10-10-3-107 ~]# awk -F ':' '{printf("文件名:%s,行数:%d,列数:%d,内容:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
文件名:/etc/passwd,行数:1,列数:7,内容:root:x:0:0:root:/root:/bin/bash
文件名:/etc/passwd,行数:2,列数:7,内容:bin:x:1:1:bin:/bin:/sbin/nologin
文件名:/etc/passwd,行数:3,列数:7,内容:daemon:x:2:2:daemon:/sbin:/sbin/nologin
文件名:/etc/passwd,行数:4,列数:7,内容:adm:x:3:4:adm:/var/adm:/sbin/nologin
文件名:/etc/passwd,行数:5,列数:7,内容:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
文件名:/etc/passwd,行数:6,列数:7,内容:sync:x:5:0:sync:/sbin:/bin/sync
文件名:/etc/passwd,行数:7,列数:7,内容:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
自定义变量:
例如:统计当前文件夹下一txt为后缀的文件大小。
[root@vm10-10-3-107 ~]# ls -l
total 16
-rw-r--r-- 1 root root 20 Nov 20 15:27 test1.txt
-rw-r--r-- 1 root root 20 Nov 20 15:27 test2.txt
-rw-r--r-- 1 root root 20 Nov 20 15:02 test.txt
-rw-r--r-- 1 root root 20 Nov 20 15:28 test.txt.bac
[root@vm10-10-3-107 ~]# ls -l *.txt | awk '{sum+=$5} END {print sum}'
60
语句:
awk中的条件语句(if…else if…else)和循环语句(while、do…while、for、break、continue)与C语言类似。
数组:
awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key),值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。
例如:统计重复出现次数。
[root@vm10-10-3-107 ~]# cat test.txt
a 00
b 01
c 00
d 02
e 03
f 03
g 01
h 00
[root@vm10-10-3-107 ~]# cat test.txt|awk '{sum[$NF]+=1} END {for(i in sum) print i,sum[i]}'
00 3
01 2
02 1
03 2