awk的基本⽤法

awk是报告⽣成器,格式化⽂本输出,有多种版本。centos中的是gawk即GNU awk版本。

awk⼯作原理:
第⼀步:执⾏BEGIN{action;...}语句块中的语句。
第⼆步:从⽂件或标准输⼊(stdin)读取⼀⾏,然后执⾏pattern{action;...}语句块,它逐⾏扫描⽂
件,从第⼀⾏到最后⼀⾏重复这个过程,直到⽂件全部被读取完毕。
第三步:当读⾄输⼊流末尾时,执⾏END{action;...}语句块。
BEGIN语句块在awk开始从输⼊流中读取⾏之前被执⾏,这是⼀个可选的语句块,⽐如变量初始化、打
印输出表格的表头等语句通常可写咋BEGIN语句块中。
END语句块在awk从输⼊流中读完所有的⾏之后被执⾏,⽐如打印所有⾏的分析结果这类信息汇总都是
在END语句块中完成,它也是⼀个可选语句块。
pattern语句块中的通⽤命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执⾏
{print},即打印每⼀个读取到的⾏,awk读取的每⼀⾏都会执⾏该语句块。
print格式:print item1, item2, ...

注意:
逗号分隔符;
输出的各item可以是字符串,也可是数值;当前记录的字段、变量或awk的表达式;
如省略item,相当于print $0。

awk基本⽤法

awk [options] 'program' var=value file ...
awk [options] -f programfile var=value file ...
awk [options] 'BEGIN{ action;...} pattern{ action;... } END{ action;... }' file
...
awk程序通常由:BEGIN语句块、能够使⽤模式匹配的通⽤语句块、END语句块等三部分组成。
program通常是被单引号或双引号括起来。
选项:
-F:指明输⼊时⽤到的字段分隔符;
-v var=value:⾃定义变量。

基本格式:
awk [options] 'program' file
program:表⽰为pattern{action statements;...}
pattern:表⽰部分决定动作语句何时触发及触发事件BEGIN、END;
action statements:表⽰对数据进⾏处理,放置{}内指明print、printf。
分隔符、域和记录:
awk执⾏时,由分隔符的字段(域)标记$1,$2...$n称为域标识。$0为所有域,注意:和shell中变量
$符含义不同;
⽂件的每⼀⾏称为记录;
省略action,则默认执⾏print $0的操作。

[root@magedu ~]# head -10 /etc/passwd > awktest.txt
解释:生成需要的测试数据
【例1】awk省略action,默认执⾏print $0
[root@CentOS7 17chapter]#awk '{print}' awktest.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

例2】指定:(冒号)为分隔符,打印每⾏记录的第⼀个字段即输出$1

awk -F: '{print $1}' awktest.txt
root
bin
daemon
adm
lp
sync

例3】取出磁盘使⽤率
[root@localhost ~]# df |grep "^/dev"|awk '{print $5}'
24%
19%
100%

awk的变量⽤法
内置变量:
FS:输⼊⾃动分隔符,默认为空⽩字符;
OFS:输出⾃动分隔符,默认为空⽩字符;
RS:输⼊记录分隔符,指定输⼊时的换⾏符,原换⾏符仍有效;
ORS:输出记录分隔符,输出时⽤指定符号代替换⾏符;
NF:字段数量;
NR:⾏号;(以记录分隔符为标准)
FNR:各⽂件分别计数,记录号;
FILENAME:当前⽂件名;
ARGC:命令⾏参数的个数;