1.awk简介
awk本身是一种编程语言,支持条件判断、数组和循环等,很高大上,但是我们最常用的是它的文本分析功能,通过查看/usr/bin/awk可以看到它链接到gawk,所以我们使用的实际上gawk
2.awk的基本格式
awk [-F field-separator] 'BEGIN { } {command1;command2} END{ } ' filename(s)
1)-F:指定域的分隔符,默认为空格,分隔符可以为逗号、冒号、制表符等
2)' '单引号,引用命令行
3)BEGIN:初始化代码块,在处理每一行数据前先执行该处,主要是进行全局变量的引用和FS分隔符的设定
4)commands:命令代码块,可以为多个命令,之间用分号分开
5)END:结尾代码块,每一行数据处理完之后执行该处,主要是对数据进行统计计算或者打印一些消息
3.awk的处理方式
awk是逐行处理,也就是先处理文本文件的第一行数据,按照指定分隔符和预设命令进行处理,如果没有指定分隔符,默认为空格分割,处理完第一行之后依次处理下一行,直到所有的数据处理完成,awk以识别"换行符\n"为一行的结束标志
4.awk的入门
[rhino@promote ~]$ cat 11.log
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
1)rhino@promote ~]$ awk -F ':' '{print $1}' 11.log
root
bin
2)[rhino@promote ~]$ awk -F ':' 'BEGIN {print "cc","dd"}{print $1} END {print "good"}' 11.log
cc dd
root
bin
good
awk命令先处理初始化BEGIN部分的命令,然后处理文件操作命令,待所有行命令处理完成后再执行END命令,$1代表第一个经过分隔符分割
5.awk的内置变量
ARGC 命令行参数个数 ARGV 命令行参数排列 ENVIRON 支持队列中系统环境变量的使用 FILENAME awk浏览的文件名 FNR 浏览文件的记录数 FS 设置输入域分隔符,等价于命令行 -F选项 NF 浏览记录的域的个数 NR 已读的记录数 OFS 输出域分隔符 ORS 输出记录分隔符 RS 控制记录分隔符
1)
[rhino@promote ~]$ awk -F ':' '{print "filename:" FILENAME,"linenumber:"NR,"columns:"NF,"linecontent:"$0}' /etc/passwd|head -2
filename:/etc/passwd linenumber:1 columns:7 linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd linenumber:2 columns:7 linecontent:bin:x:1:1:bin:/bin:/sbin/nologin
2)
[rhino@promote ~]$ awk -F ':' '{print $NF}' /etc/passwd |head -2
/bin/bash
/sbin/nologin
【说明:】
1)字符串需要用双引号,内置变量不用$号引用,$0代表整条完整记录,FILENAME代表流览的文件名,NF代表每一行分割后的域的个数或者说列数,NR代表浏览的行数或者记录数,$1代表第一个域,$2代表第二个域,依次类推
2)从上面的例子中可以看出NF和$NF是完全不同的,前者代表被分隔符分割后的域的个数或者列数;而后者代表被分割后的最后一个域值
6.格式化输出
1)输出值之间以冒号(:)进行分割
[rhino@promote ~]$ awk -F ':' '{print $1":"$NF}' /etc/passwd |head -2
root:/bin/bash
bin:/sbin/nologin
2)输出值之间以TAB键进行分割
[rhino@promote ~]$ awk -F ':' '{print $1"\t"$NF}' /etc/passwd |head -2
root /bin/bash
bin /sbin/nologin
3)进行字符串拼接
[rhino@promote ~]$ awk -F ':' '{print "filename:" FILENAME,"linenumber:"NR,"columns:"NF,"linecontent:"$0}' /etc/passwd|head -2
filename:/etc/passwd linenumber:1 columns:7 linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd linenumber:2 columns:7 linecontent:bin:x:1:1:bin:/bin:/sbin/nologin
[rhino@promote ~]$ awk -F ':' '{print "$0"}' /etc/passwd |head -2
$0
$0
4)多个域进行输出时,如无特殊要求需要使用逗号(,)隔开,否则输出结果各个域值都会连在一起,如
[rhino@promote ~]$ awk -F ':' '{print $1,$2}' /etc/passwd |head -2
root x
bin x
[rhino@promote ~]$ awk -F ':' '{print $1$2}' /etc/passwd |head -2
rootx
binx