目录
一.概述
二.工作原理
三.工作流程
1.运行模式
2.运行流程
四.基本语法
1.命令格式
2.常用变量
五.变量类型
1.内建变量
2.内置变量
3.BEGIN END运算
4.awk高级用法
5.awk if语句
6.BEGIN END循环
一.概述
AWK是一种处理文本文件的语言,是一个强大的文件分析工具。
它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描,过滤,统计汇总等工作,数据可以来自标准输入也可以是管道或文件。
二.工作原理
逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个"字段",然后再进行处理。
awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。在使用awk命令的过程中,可以使用逻辑操作符"&&“表示"与”、"||'表示"或"、"!“表示"非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方
三.工作流程
- 读取数据:awk从指定的数据文件中逐行读取文本数据。
- 更新内置变量:在读取数据的过程中,awk会自动更新其内置的系统变量,如列数变量NF、行数变量NR、当前行0以及各个列变量0以及各个列变量0以及各个列变量1、$2等。
- 执行匹配模式及其操作:对于每一行数据,awk会检查是否有匹配的模式(pattern)及其对应的操作(actions)。如果匹配成功,则执行相应的操作。如果没有指定模式,则默认对所有行执行操作;如果没有指定操作,则默认输出匹配的行。
- 重复处理:当一行数据处理完毕后,如果数据文件中还有未读取的数据行,awk会返回到第一步,继续读取和处理下一行数据,直到所有数据都被处理完毕。
此外,awk还支持BEGIN和END语句块,BEGIN语句块在开始处理数据前执行,通常用于初始化变量或执行一些预处理操作;END语句块在处理完所有数据后执行,通常用于汇总结果或进行最后的处理
1.运行模式
(1)、正则表达式
(2)、关系表达式
(3)、组合的Pattern
(4) 、Pattern1,Pattern2
(5) 、BEGIN
(6) 、END
2.运行流程
首先,awk的基本语法为 awk ‘pattern{actions}’,其中pattern代表匹配模式,actions表示要执行的操作,pattern和actions都是可选的,但是两者必须至少有一个;
工作流程:(反复执行4个步骤) 1、自动从指定的数据文件中读取行文本 2、自动更新awk的内置系统变量的值,例如列数变量NF、行数变量NR、行变量$0以及各个列变量$1、$2等 3、依次执行程序中所有的匹配模式及其操作 4、当执行完程序中所有的匹配模式及其操作之后,如果数据文件中仍然还有未读取的数据行,则返回到第1步,重复执行1-4的操作。
awk程序结构:
- 开始块:BEGIN BLOCK
- 主体块:Body block
- 结束块:END block
四.基本语法
1.命令格式
awk 选项 '模式或条件 {操作}' 文件 1 文件 2 …
awk -f 脚本文件 文件 1 文件 2 …
2.常用变量
- FS:指定每行文本的字段分隔符,默认为空格或制表位。
- NF:当前处理的行的字段个数。在执行过程中对应于当前的字段数,NF:列的个数
- NR:当前处理的行的行号(序数)。 在执行过程中对应于当前的行号
- $0:当前处理的行的整行内容。
- $n:当前处理行的第 n 个字段(第 n 列)。比如: $1 表示第一个字段,$2 表示第二个字段
- FILENAME:被处理的文件名(当前输入文件的名)。
- FNR 各文件分别计数的行号
- OFS 输出字段分隔符(默认值是一个空格)
- ORS 输出记录分隔符(默认值是一个换行符)
- RS:行分隔符。awk从文件上读取资料时,将根据Rs的定义把资料切割成许多条记录, 而awk一次仅读入一条记录,以进行处理。预设值是" \n'
- 简说:数据记录分隔,默认为\n,即每行为一条记录
五.变量类型
1.内建变量
- FS:指定每行文本的字段分隔符,默认为空格或制表位。
- NF:当前处理的行的字段个数。在执行过程中对应于当前的字段数,NF:列的个数
- NR:当前处理的行的行号(序数)。 在执行过程中对应于当前的行号
- $0:当前处理的行的整行内容。
- $n:当前处理行的第 n 个字段(第 n 列)。比如: $1 表示第一个字段,$2 表示第二个字段
- FILENAME:被处理的文件名(当前输入文件的名)。
- FNR 各文件分别计数的行号
- OFS 输出字段分隔符(默认值是一个空格)
- ORS 输出记录分隔符(默认值是一个换行符)
- RS:行分隔符。awk从文件上读取资料时,将根据Rs的定义把资料切割成许多条记录, 而awk一次仅读入一条记录,以进行处理。预设值是" \n'
(1)'print'案例
以[:/]为分隔符打印出第九列
2.内置变量
- awk常用内置变量:$1、$2、NF、NR、$0
- $1:代表第一列
- $2:代表第二列以此类推
- $0:代表整行
- NF:一行的列数
- NR:行数
打印出含有root的整行内容
打印出含有root的行数的第一列
打印出每一行的行号和内容
3.BEGIN END运算
- 逐行执行开始之前执行什么任务,结束之后再执行什么任务,用BEGIN、END
- BEGIN一般用来做初始化操作,仅在读取数据记录之前执行一次
- END一般用来做汇总操作,仅在读取完数据记录之后执行一次
4.awk高级用法
定义引用变量
5.awk if 语句
6.BEGIN END 流程
- awk还支持for循环、while循环、函数、数组等 其他
- awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
- 第一步:运行BEGIN{ commands }语句块中的语句。
- 第二步:从文件或标准输入(stdin)读取一行。然后运行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行反复这个过程。直到文件所有被读取完成。
- 第三步:当读至输入流末尾时,运行END{ commands }语句块。
- BEGIN语句块在awk开始从输入流中读取行之前被运行,这是一个可选的语句块,比方变量初始化、打印输出表格的表头等语句通常能够写在BEGIN语句块中。
- END语句块在awk从输入流中读取全然部的行之后即被运行。比方打印全部行的分析结果这类信息汇总 都是在END语句块中完毕,它也是一个可选语句块。
- pattern语句块中的通用命令是最重要的部分,它也是可选的。假设没有提供pattern语句块,则默认运
- 行{ print },即打印每个读取到的行。awk读取的每一行都会运行该语句块。
[root@localhost ~] #awk 'BEGIN{x=0};/\/bin\/bash$/ {x++;print x,$0};END {printx}' /etc/passwd# 统计以 / bin/bash 结尾的行数,等同于[root@localhost ~] #grep -c "/bin/bash$" /etc/passwd
[root@localhost ~] #awk 'BEGIN {FS=":"} ;{if($3>=1000){print}}' /etc/passwd# 先处理完 BEGIN 的内容,再打印文本里面的内容
# 输出第 7 个字段既不为 /bin/bash ,也不为 /sbin/nologin 的所有行[root@localhost ~] #awk -F: '($NF !=" /bin/bash")&&($NF !=" /sbin/nologin" ){print NR, $0}' passwd
通过管道、双引号调用 shell 命令 :[root@localhost ~] #echo $PATH | awk 'BEGIN{RS=":"};END {print NR}'# 统计以冒号分隔的文本段落数, END{ } 语句块中,往往会放入打印结果等语句[root@localhost ~] #echo $PATH | awk 'BEGIN{RS=":"};{print NR,$0};END {print NR}'
[root@localhost ~] #awk -F: '/bash$/{print | "wc -l"}' /etc/passwd# 调用 wc -l 命令统计使用 bash 的用户个数 , 等同于 grep -c "bash$" etc/passwd[root@localhost ~] #awk -F: '/bash$/ {print}' /etc/passwd | wc -l
[root@localhost ~] #free -m |awk '/Mem:/ {print int($3/($3+$4)*100)"%"}' # 查看当前内存使用百分比