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
|
Author
Alfons
LastMod
2019-03-23
License
Creative Commons BY-NC-ND 3.0