正所谓,知己知彼百战不殆,想要拿下awk,必需了解它的前世今生;
一、它可以做什么
1、 awk 是一种编程语言, 可以用作linux或者Unix的bash脚本中;也可以单独放在一个文件中,通过awk命令解释器运行;
【这里只关注awk用作bash脚本中】
2、awk 主要功能是,基于指定的规则,对文本或者数据做浏览和提取操作; 其处理原则为:逐行扫描文件,从第一行到最后一行,寻找匹配指定规则的内容。 【awk命令的主要功能是对文本做提取操作,所以,bash脚本编写中,awk经常与其它指令联合是使用:通过awk提取指定行,然后对该行做你所需要的操作。
二、它怎么使用呢
1、语法结构
awk 选项 '命令部分' 文件名
【基本的awk 指令语法构成就是如上所示,也有一些更高阶的操作,这个后续再学习】
2、一些基本概念 【写在前面的东西】
1)分隔符和域
分隔符,就是语法结构中的『选项』部分, awk指令中,通过 -F 来定义字段的分隔符; awk指令默认的分隔符为空格,如果要处理的文件时以空格分割,则无需指定选项 -F ; 如果是通过除空格之外的其它字符分割,则必需指定-F ;
域: 定义了分隔符,则比如会有文本被分割成一段一段的, 这里统称为域; 域的标记符为:$1, $2, $3 ... $n ; 其中,$0 表示所有的域;
一个栗子:【遗留一个问题, 如果实现tab键分割,后续学习后,再补充】
定义文件【文件包含多列,列之间通过逗号分割】:
vim 1
序号,姓名,年龄,职业$
1,张三,19,学生$
2,李四,25,程序员$
3,王五,40,教师$
awk -F , '{print $0}' 1
输出结果为:
序号,姓名,年龄,职业
1,张三,19,学生
2,李四,25,程序员
3,王五,40,教师
#解析: -F 定义分隔符为逗号; 如果是以其它字符分割,则直接更换即可;
$0 定义域,这里输出全部域; 【可以通过域标识符,更换输出的域, 比如$1, 则只输出第一列】
1 为我定义的文件名字;
2)模式和动作
他们说,awk语句,是由『模式』和『动作』两部分组成的;那么什么是模式,什么是动作呢?
动作:就是,定义对数据的具体操作;【也就是一些列的操作指令】;
模式:则定义了『动作』被触发的条件;
【可以是条件语句、正则匹配、复合语句等】;
【当然了,这并非必需的,若没有定义模式,则动作将保持时刻被触发的状态】
【模式以关键词BEGIN和END来标识, 其中BEGIN 定义在 动作之前执行; END定义的内容则在动作之后执行】
一个栗子:
还是文件: 1;
执行如下指令:
$ awk -F , 'BEGIN {print "---start print the file---"} {print $2} END {print "---the end---"}' 1
输出结果为:
---start print the file---
姓名
张三
李四
王五
---the end---
#解析:
1、-F: 定义分隔符,不做解释;
2、'BEGIN {print "---start print the file---"} {print $2} END {print "---the end---"}' 为模式定义和动作定义; 单引号不能省略;
1)其中 BEGIN {print "---start print the file---"} 定义动作开始前执行的操作;
2){print $2} 为动作定义;
3) END {print "---the end---"}' 定义动作结束后执行的操作;
4)每一个操作,需要{};