awk:报告生成器,格式化文本输出工具
我们平时在系统上用的awk为gawk
gawk:
基本用法:gawk [ options ] 'program' file ...
program:PATTERN{ACTION STATEMENTS} 语句之间用分隔符
print, printf
选项:
-F:指明输入时用到的字段分隔符
-v var=value:自定义变量
awk处理文本的方式:从对应文件中一次读取一行,根据输入分隔符进行切片,把每一个片都保存在awk内建的位置变量中($1,$2,$3,$4……)。$0则表示一整行。
1、print
print item1, item2, ... 要点: (1)以逗号为分隔符; (2)输出的各item可以是字符串。,也可以是数值,也可以是记录的字段,变量或awk的表达式; (3)如省略item,相当于print $0;
可以看到命令行中每个item以逗号为分隔符,但是在显示结果时默认以空格为分隔符
2、变量
2.1 内建变量 FS:input filed seperator,默认为空白字符 OFS:output filed seperator,默认为空白字符
RS:input record seperator,输入时的换行符 ORS:output record seperator ,输出时的换行符 NF: 字段数量
注意区分{print NF}和{print $NF}
NR:行数 FNR:各文件分别计数,行数
如果是多个文件,则下一个文件接着前一个文件继续计数
FILENAME:当前文件名
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给的各参数。
可以看到由于awk的工作机制决定,每读入一行就会将结果输出一遍,如果我们想只输出一遍,则可以使用BEGIN模式
2.2自定义变量
(1)-v var=value 变量名区分大小写
(2)在program中直接定义
注意在某些版本中,定义变量要使用双引号““,否则会报错
- 3、printf ,格式化输出
printf FORMAT, item1, item2, …
(1)FORMAT必须给出
(2)不会自动换行,需要显示给出自动换行控制符,\n
(3)FORMAT中需要分别为后面的每一个item指定一个格式化符号;
格式符:
%c:显示字符的ASCII码
%d,%i:显示十进制整数
%e,%E:科学计数法显示
%f:显示浮点数
%g,%G,以科学计数法或浮点数显示数值
%s:显示字符串
%u:无符号整数
%%:显示%本身
将$1套在%s上以字符串的形式输出,默认是没有换行符的
修饰符:
#[.#]: 第一个数字控制显示的宽度,第二个#表示小数点后的精度
%3.1f
-:左对齐(默认为右对齐)
+:显示数值的符号
* 4、操作符
[root@server1 ~]# awk -F: '{$3>1000?Usertype="common user":Usertype="System user"; printf "%d:" "%s:" "%-10s\n",$3,$1,Usertype}' /etc/passwd
5、PATTERN
(1)empty:空模式,匹配每一行
(2)/正则表达式/:仅处理能够被此模式匹配到的行
对以root开头的行处理
对以/bin/bash结尾的行处理
对id号答于1000的行处理
(3)relational expression:关系表达式,结果有“真“有“假“;结果为“真“才会被处理;
真:结果为非0值,非空字符串
(4)行范围
startline,endline:/pat1/,/pat2/
注意:不能直接给出数字格式
第一个以root开头的行开始到第一个以sync结尾的行进行处理
对2-10行进行处理,不能直接写数字
(5)BEGIN/END模式
BEGIN{}:仅在开始处理文件中的文本之前执行一次
END{}:仅在文本处理完成之后执行一次
[kiosk@foundation44 Desktop]$ awk -F: 'BEGIN{print " username uid \n-----------------"}(NR>=5&&NR<=10){printf "%10s" "%5d\n",$1,$3} END{print "end--------------"}' /etc/passwd
默认以空格为分隔符,不管中间有几个空格
以空格为分隔符,输出第1列
以空格为分隔符,输出第1,3列
http://www.runoob.com/linux/linux-comm-awk.html
以 : 为分隔符,输出第一列
1和
1
和
3之间以tab隔开
1和
1
和
3之间换行
(来自:https://www.cnblogs.com/ginvip/p/6352157.html)
显示第3行到第7行的第1个字段
请从该文件中过滤出’wtt’字符串与like,最后输出的结果为:wtt like
统计用户数量
count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开。这里没有初始化count,虽然默认是0,但是妥当的做法还是初始化为0:
[root@server1 tmp]# awk 'BEGIN {count=0;print "[start] user count is ",count} {count=count+1;print $0} END{print "[end] user count is ",count}' passwd
[start] user count is 0
。。。。。。。。。。。。。。。
[end] user count is 31
统计文件大小