- 一、初识awk
- 二、awk工作原理
- 三、内置变量
- (一)FS:字段分隔符(field separator)
- (二)OFS:输出的字段分隔符(output field separator)
- (三)RS:记录分隔符(record separator)
- (四)ORS:输出的记录分隔符(output record separator)
- (五)NF:字段数量(number of field)
- (六)NR:记录编号(number of record)
- (七)FNR:按文件计算“记录编号”(file (1)FNR 表示当前行在不同输入流中处于第几行
- (八)FILENAME:文件名
- (九)ARGC:参数个数(arguments account)
- (十)ARGV:参数列表数组(arguments variable)
- 四、自定义变量
- 五、printf
一、初识awk
(一)什么是awk?
awk,全称:Aho Weinberger Kernighan
是一个报告生成器,用于格式化文本输出
(二)awk能做什么?
1、主要功能:格式化显示文档、或者打印报表
2、将给定的文本内容按照工程师想要的格式输出显示、或者打印成报表格式
3、日常用途:处理各种文档(比如日志信息),从中分析挖掘出工程师关心的必要数据,并且打印成报表
(三)CentOS7系统中的awk
1、gawk
在CentOS7(或者CentOS6)系统中,使用GNU项目组开发的gawk来实现awk的功能
Gawk is the GNU Project’s implementation of the AWK programming language.
2、awk是一个软链接,指向gawk
$ ll /usr/bin/awk
软链接:/usr/bin/awk
真身:/usr/bin/gawk
STDOUT:
lrwxrwxrwx. 1 root 4 Mar 28 01:54 /usr/bin/awk -> gawk
(四)awk的基本语法
1、第一种语法格式
awk [options] 'program' var=VALUE /PATH/TO/SOMEFILE...
(1)options:选项
(2)program:程序,使用awk语言,用单引号 ” 引起来
相对比较复杂,需要根据生产需求的逻辑关系编写awk程序代码,从而实现特定功能
2、第二种语法格式
awk [options] -f programFile var=VALUE /PATH/TO/SOMEFILE...
(1)-f programFile:将逻辑复杂的awk程序代码放在programFile程序文件中,用 -f 调用awk程序文件
3、第三种语法格式
awk [options] 'BEGIN{
action;...}pattern{action;...}END{
action;...}' /PATH/TO/SOMEFILE...
(五)awk处理机制
1、逐行处理
(1)会在内存中开辟一块awk处理文本的内存空间
(2)每一次读入文件中的一行文本到内存空间进行处理
(4)自带循环:处理完第一行并输出,然后再读入第二行,以此类推
2、切割字段
(1)可以根据指定的分隔符,把读入的一行文本切割成若干的字段
(2)每个字段都有对应的变量来表示
变量 | 含义 |
---|---|
$0 | 读入的整行 |
$1 | 第一个字段 |
$n | 第n个字段 |
(3)默认的字段分隔符是 空白符 (空格、tab键)
(4)而且个数不限,多个连续的空白符被识别为一个空白符
(六)awk中的行与列
1、记录
(1)在awk中,把读入的一行称为“记录”,英文:record
(2)类似于Excel表的一行
(3)在awk中,一般需要手动指定“记录分隔符”,用来区分每一行
(4)默认使用 \n (回车换行符) 作为记录分隔符
2、字段
(1)在awk中,把切割后的每一列称为“字段”,英文:field
(2)类似于Excel表的每一列
(3)在awk中,一般需要手动指定“字段分隔符”,用来将读入的一行文本切割成若干的字段
(4)默认使用 空白符 (空格、tab键) 作为记录分隔符
3、小结
通用概念 | awk概念 | 默认分隔符 | 解释 |
---|---|---|---|
行 | 记录 | \n | 回车换行符 |
列 | 字段 | 空白符 | 空格、tab键 |
二、awk工作原理
(一)典型的语法格式
awk [options] 'BEGIN{
action;...}pattern{action;...}END{
action;...}' /PATH/TO/SOMEFILE...
(二)执行流程
- 第一步:执行 BEGIN{action;…} 语句块,与文件无关
- 第二步:从文件或者STDIN中读取一行,然后执行 pattern{action;…} 语句块,它逐行扫描文本内容,从第一行到最后一行重复这个过程,直到文本内容全部被读取完毕
- 第三步:当读至输入流末尾时,执行 END{action;…} 语句块
(三)语句块使用场景
1、BEGIN语句块
BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如:变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中
2、END语句块
END语句块在awk从输入流中读取完所有的行之后即被执行,它也是一个可选语句块,比如:打印所有行的分析结果这类信息汇总都是在END语句块中完成
3、pattern语句块
pattern语句块中的通用命令是最重要的部分