awk命令 输入的数据为 行数据,经过一些判别处理后,按对应的格式输出。

一般的命令格式为: awk [选项] '程序' 文件

常用选项:

  • -F fs:fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:,以":“作为分割符。
  • -v var=value:赋值一个用户定义变量,将外部变量传递给awk。
  • -f scripfile:从脚本文件中读取awk命令。

程序部分可以是下面的任意一种或多种形式的组合:

  • /正则表达式/:使用通配符的扩展集。
  • 关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。
  • 模式匹配表达式:用运算符~(匹配)和~!(不匹配)。
  • BEGIN语句块、pattern语句块、END语句块。

内建变量:

内建变量名说明
$0当前记录(这个变量中存放着整个行的内容)
$1~$n当前记录的第n个字段,字段间由FS分隔
FS输入字段分隔符 默认是空格或Tab
NF当前记录中的字段个数,就是有多少列
NR已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
FNR当前记录数,与NR不同的是,这个值会是各个文件自己的行号
RS输入的记录分隔符, 默认为换行符
OFS输出字段分隔符, 默认也是空格
ORS输出的记录分隔符,默认为换行符
FILENAME当前输入文件的名字

工作原理

awk脚本 的基本结构:awk 'BEGIN{ commands } pattern{ commands } END{ commands }'

  • BEGIN语句块: 在数据读入前执行,如变量的初始化,打印表头等操作可在这里执行。
  • pattern语句块: 这一部分为 awk命令 的核心,awk会从文件或者stdin中按行读取内容,由pattern语句部分进行处理。
  • END语句块: 会在处理完所有的数据行后执行,比如打印所有的数据分析结果。

例子

待处理文件:

1
2
3
4
5
6
7
8
指标	2019年1月	2018年12月	2018年11月	2018年10月	2018年9月	2018年8月	2018年7月	2018年6月	2018年5月	2018年4月	2018年3月	2018年2月
居民消费价格指数(上年同月=100)	101.7	101.9	102.2	102.5	102.5	102.3	102.1	101.9	101.8	101.8	102.1	102.9
食品烟酒类居民消费价格指数(上年同月=100)	102.0	102.4	102.5	102.9	103.0	101.9	101.0	100.8	100.7	101.1	102.0	103.6
衣着类居民消费价格指数(上年同月=100)	101.6	101.5	101.4	101.4	101.2	101.3	101.2	101.1	101.1	101.1	101.1	101.1
居住类居民消费价格指数(上年同月=100)	102.1	102.2	102.4	102.5	102.6	102.5	102.4	102.3	102.2	102.2	102.2	102.2
生活用品及服务类居民消费价格指数(上年同月=100)	101.5	101.4	101.5	101.5	101.6	101.6	101.6	101.5	101.5	101.5	101.6	101.8
交通和通信类居民消费价格指数(上年同月=100)	98.7	99.3	101.6	103.2	102.8	102.7	103.0	102.4	101.8	101.1	100.3	101.5
教育文化和娱乐类居民消费价格指数(上年同月=100)	102.9	102.3	102.5	102.5	102.2	102.6	102.3	101.8	101.9	102.0	102.2	103.7

添加前后标识:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ awk 'BEGIN{print "----------awk begin-----------"} {print} END{print "----------awk end--------------"}' awktest.txt
----------awk begin-----------
指标    2019年1月       2018年12月      2018年11月      2018年10月      2018年9月       2018年8月       2018年7月       2018年6月       2018年5月       2018年4月       2018年3月     2018年2月
居民消费价格指数(上年同月=100)  101.7   101.9   102.2   102.5   102.5   102.3   102.1   101.9   101.8   101.8   102.1   102.9
食品烟酒类居民消费价格指数(上年同月=100)        102.0   102.4   102.5   102.9   103.0   101.9   101.0   100.8   100.7   101.1   102.0   103.6
衣着类居民消费价格指数(上年同月=100)    101.6   101.5   101.4   101.4   101.2   101.3   101.2   101.1   101.1   101.1   101.1   101.1
居住类居民消费价格指数(上年同月=100)    102.1   102.2   102.4   102.5   102.6   102.5   102.4   102.3   102.2   102.2   102.2   102.2
生活用品及服务类居民消费价格指数(上年同月=100)  101.5   101.4   101.5   101.5   101.6   101.6   101.6   101.5   101.5   101.5   101.6   101.8
交通和通信类居民消费价格指数(上年同月=100)      98.7    99.3    101.6   103.2   102.8   102.7   103.0   102.4   101.8   101.1   100.3   101.5
教育文化和娱乐类居民消费价格指数(上年同月=100)  102.9   102.3   102.5   102.5   102.2   102.6   102.3   101.8   101.9   102.0   102.2   103.7
----------awk end--------------

显示增长的百分比:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 先排除第一行(NR==1),直接打印。
# 第一行之外,遍历每行的各个字段,第一个字段不处理,其余字段格式化输出。
$ awk 'NR==1{print}; NR!=1{for(i=1;i<NF;i++) if(i>1) printf "\t%-0.2f\%",$i-100;else if(i==1) printf "%-32s",$i}; { print"\n";}' ORS="" awktest.txt 
指标    2019年1月       2018年12月      2018年11月      2018年10月      2018年9月       2018年8月       2018年7月       2018年6月       2018年5月       2018年4月       2018年3月     2018年2月
居民消费价格指数(上年同月=100)                  1.70%   1.90%   2.20%   2.50%   2.50%   2.30%   2.10%   1.90%   1.80%   1.80%   2.10%
食品烟酒类居民消费价格指数(上年同月=100)                2.00%   2.40%   2.50%   2.90%   3.00%   1.90%   1.00%   0.80%   0.70%   1.10%   2.00%
衣着类居民消费价格指数(上年同月=100)            1.60%   1.50%   1.40%   1.40%   1.20%   1.30%   1.20%   1.10%   1.10%   1.10%   1.10%
居住类居民消费价格指数(上年同月=100)            2.10%   2.20%   2.40%   2.50%   2.60%   2.50%   2.40%   2.30%   2.20%   2.20%   2.20%
生活用品及服务类居民消费价格指数(上年同月=100)          1.50%   1.40%   1.50%   1.50%   1.60%   1.60%   1.60%   1.50%   1.50%   1.50%   1.60%
交通和通信类居民消费价格指数(上年同月=100)              -1.30%  -0.70%  1.60%   3.20%   2.80%   2.70%   3.00%   2.40%   1.80%   1.10%   0.30%
教育文化和娱乐类居民消费价格指数(上年同月=100)          2.90%   2.30%   2.50%   2.50%   2.20%   2.60%   2.30%   1.80%   1.90%   2.00%   2.20%

通过特殊的字符过滤特定的行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 只显示居住类指标数据
# ~ 为匹配包含后续字符串的内容, !~ 为不匹配
# /居住/ 为正则匹配规则
$ awk 'NR==1{print}; NR!=1 && $1 ~ /居住/' awktest.txt 
指标    2019年1月       2018年12月      2018年11月      2018年10月      2018年9月       2018年8月       2018年7月       2018年6月       2018年5月       2018年4月       2018年3月     2018年2月
居住类居民消费价格指数(上年同月=100)    102.1   102.2   102.4   102.5   102.6   102.5   102.4   102.3   102.2   102.2   102.2   102.2

$ awk 'NR==1{print}; NR!=1 && $1 !~ /居住/' awktest.txt 
指标    2019年1月       2018年12月      2018年11月      2018年10月      2018年9月       2018年8月       2018年7月       2018年6月       2018年5月       2018年4月       2018年3月     2018年2月
居民消费价格指数(上年同月=100)  101.7   101.9   102.2   102.5   102.5   102.3   102.1   101.9   101.8   101.8   102.1   102.9
食品烟酒类居民消费价格指数(上年同月=100)        102.0   102.4   102.5   102.9   103.0   101.9   101.0   100.8   100.7   101.1   102.0   103.6
衣着类居民消费价格指数(上年同月=100)    101.6   101.5   101.4   101.4   101.2   101.3   101.2   101.1   101.1   101.1   101.1   101.1
生活用品及服务类居民消费价格指数(上年同月=100)  101.5   101.4   101.5   101.5   101.6   101.6   101.6   101.5   101.5   101.5   101.6   101.8
交通和通信类居民消费价格指数(上年同月=100)      98.7    99.3    101.6   103.2   102.8   102.7   103.0   102.4   101.8   101.1   100.3   101.5
教育文化和娱乐类居民消费价格指数(上年同月=100)  102.9   102.3   102.5   102.5   102.2   102.6   102.3   101.8   101.9   102.0   102.2   103.7

统计目录下文件的大小之和:

1
2
3
# 通过管道将数据传给awk统计
$ ls -l |awk '{sum+=$5}; END {printf "%dKB\n",sum/1024}'
17KB