awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息。
awk处理过程: 依次对每一行进行处理,然后输出 。
awk命令形式:
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
[-F|-f|-v] 大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
BEGIN 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
END 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
// 匹配代码块,可以是字符串或正则表达式
{} 命令代码块,包含一条或多条命令
; 多条命令使用分号分隔
awk的特殊符号:
$0:表示整个当前行
$1:每行第一个字段
NF:字段数量变量
NR:每行的记录号,多文件记录递增
FNR:与NR类似,不过多文件记录不递增,每个文件都从1开始
FS:BEGIN时定义分隔符(相当于-F)
RS:输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~:匹配,与==相比不是精确比较
!~:不匹配,不精确比较
==:等于,必须全部相等,精确比较
!=:不等于,精确比较
+:匹配时表示1个或1个以上
OFS:输出字段分隔符, 默认也是空格,可以改为制表符等
ORS:输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
print:是awk打印指定内容的主要命令(标准化输出)
printf:格式化输出
下面举几个例子,能更便于理解!!!
1、
这里是通过awk把/etc/passwd 中的用户名拿到,其中 ‘{}‘ 是固定格式。
-F: 是选定以:作为分隔符,如果是以空格作为分隔符,则直接默认不用写。
2、
这个例子则是把/etc/passwd下的gid和uid拿出来。printf是格式化输出,默认不会换行,而其中的“\n”和“\t”则是换行及有一个table键的距离。
3、
这个例子中NR是指行号,但$NR是默认每一行的结尾的那个字符段。$0是匹配的整行。
4、
这是BEGIN以及END的格式及应用,其中的{FS=":"}和-F:是相同的。后面打印的this are usernames,在最后一行打印。
5、
这是通过给X赋值的方式,来寻找/etc/fstab中的空行数。
6、
这个例子是计算uid的总和
7、
在awk中可以使用if判断和for循环,其中<(小于)、>(大于)、>=(大于等于)
8、
是通过~进行匹配,只匹配以lpp或者root开头的行数
9、
uid和gid的和如果大于二百输出
10、
其中是查看空闲内存,并把以Kb为单位换算为Mb为单位。
原文地址:https://blog.51cto.com/14239093/2389448