linux 文本处理三剑客: grep sed 和 awk 。其中 grep 是一种文本过滤工具, sed 是文本行编辑器,而 awk 是一种报表生成器,就是对文件进行格式化处理的,这里的格式化不是文件系统的格式化,而是对文件的内容进行的各种排版,进而格式化显示。
在 linux 之上我们使用 awk 是 GUN awk 简称 gawk ,并且 gawk 其实就是 awk 的连接文件, gawk 是一种过程是编程语言, gawk 还支持条件判断,数组,循环等各种编程语言中所有的可以使用的功能,因此我们还可以把 gawk 成为一种脚本语言解释器。
§ awk 基本用法 ※基本用法: awk [options] ‘ program ’ var=value file … awk [options] -f programfile var=value file … awk [options] 'BEGIN{ action; … } pattern { action; … } END{ action; … }' file …# 需要处理的文本每一行我们称之为 记录
# BEGIN{ action; … } 处理记录前的需要执行的动作,比如:打印提示符等
# pattern { action; … } 匹配时处理的动作
# END{ action; … } 处理一条记录后需要执行的东西 , 比如 : 打印结束语,或求和,求积等等。
awk 程序通常由: BEGIN 语句块、能够使用模式匹配的通用语句块、 END 语句块,共 3 部分组成
program : 通常是被单引号或双引号中 的编程语言
pattern : 模式
action; … : 动作语句,可以是由多个语句组成,各个语句使用分号分隔,如: print printf
选项:
-F 指明输入时用到的字段分隔符
-v var=value: 自定义变量
※基本格式: awk [options] 'program' file … # [options]-f /PATH/FROM/AWK_SCRIPT :指明后面需要运用的 awk 脚本
-F :指明分隔符
-v :声明变量
program:pattern{action statements;..}
pattern 和 action :
pattern 部分决定动作语句何时触发及触发事件
( BEGIN,END )
action statements 对数据进行处理,放在 {} 内指明
( print, printf )
分割符、域和记录
awk 执行时,由分隔符分隔的字段(域)标记 $1,$2..$n 称为域标识。 $0 为所有域,注意:和 shell 中变量 $ 符含义不同
文件的每一行称为记录
省略 action ,则默认执行 print $0 的操作。
※ awk 工作原理第一步:
执行 BEGIN{action; … } 语句块中的语句
比如:[root@centos68 ~]# tail -n5 /etc/passwd | awk 'BEGIN{FS=":";f=1}{print$f}'
#BEGIN{FS=”:”;f=1} : 记录处理前,表明分隔符为: 变量f=1
#{print$f} : 没有pattern表示每条记录都匹配,打印第一列
sshd
tcpdump
admin
chen
mockbuild
[root@centos68 ~]#
第二步:
从文件或标准输入 (stdin) 读取一行,然后执行 pattern{ action; … } 语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
第三步:
当读至输入流末尾时,执行 END{action; … } 语句块
BEGIN 语句块的作用
BEGIN 语句块在 awk 开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在 BEGIN 语句块中
END 语句块 的作用
END 语句块在 awk 从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在 END 语句块中完成,它也是一个可选语句块
pattern 语句块
pattern 语句块中的通用命令是最重要的部分,也是可选的。如果没有提供 pattern 语句块,则默认执行 { print } ,即打印每一个读取到的行, awk 读取的每一行都会执行该语句块
※ print 格式: print item1, item2, …要点:
(1) 逗号分隔符
(2) 输出的各 item 可以字符串,也可以是数值;当前记录的字段、变量或 awk 的表达式
(3) 如省略 item ,相当于 print $0
print 格式示例:awk '{print "hello,awk"}'
[root@