一.介绍
awk是专门为文本处理设计的编程语言,是一门数据驱动的编程语言。与sed类似,都是以数据驱动的行处理软件,主要用于数据扫描,过滤和汇总。数据可以来自于标准输入,管道或者文件。
二.语法
awk是一种处理文本文件的编程语言,文件的每行数据都被称为记录。默认以空格或者制表符为分隔符,每条记录被分成了若干字段(列)。awk每次从文件中取出一条记录。
格式:
awk [选项] '条件{动作} 条件{动作} ... ... ' 文件名
三.变量
awk语法由一系列条件和动作组成,在花括号内可以有多个动作,多个动作之间用分号分隔。在多个条件和动作之间可以有多个空格。
如果没有指定条件则匹配所有数据,如果没有指定动作,则默认为print打印动作。
3.1 常用内置变量:
- FILENAME:当前输入文档名称。
- FNR:当前输入文档的当前行号,尤其是在有多个输入文档时有用。
- NR:输入数据流的当前行号。
- $0:当前行的全部内容。
- $n:当前行第n个字段的内容。(n >= 1)
- NF:当前记录(行)的字段(列)个数。
- FS:字段分隔符,默认为空格或者Tab制表符。
- OFS:输出字段的分隔符,默认为空格。
- ORS:输出记录分隔符,默认为换行符\n。
- RS:输入记录分隔符,默认为换行符\n。
同样时输出行号,NR是将所有文件的数据视作一个数据流,而FNR是将多个文件的数据s视为独立的若干个数据流,遇到新文件时行号从1开始递增。
3.2 自定义变量
3.3 调用系统变量
3.4 自定义分隔符
awk默认使用空格,换行符,制表符作为分隔符,可以使用'-F'自定义分隔符。
3.5 内置变量RS,OFS,ORS
- RS
内置变量RS保存的是输入数据的行分隔符,默认为'\n',可以指定其他符号作为分隔符。
- OFS
保存输出列的分隔符(列分隔符),默认为空格。输出后每一列的分隔符。输出以设置的OFS作为分隔符。
- ORS
保存输出行的分隔符。默认是'\n'
3.6 print指令
可以输出常量与变量,如果是字符串常量需要用双引号括起来,数字常量可以直接打印。
3.7 条件匹配
awk支持使用正则进行模糊匹配,也支持字符串和数字的精确匹配,也支持逻辑与和逻辑或。
使用:
3.8 BEGIN和END
BEGIN导致动作指令仅在读取任何数据记录前执行一次,END导致动作指令仅在读取完所有数据记录后执行一次。
BEGIN可以进行数据初始化,END可以进行数据汇总。
3.9 数值计算
awk中的变量不需要定义就可以直接使用,未定义的字符为空,未定义数值,值为0。
3.10 循环计数
遇到符合条件的记录,进行动作。
四.条件判断语句
if后面如果只跟一个动作指令,则花括号{}可以省略,如果if后面的指令为多条则需要使用花括号{}括起来,多个指令使用分号分隔。
4.1 单分支语句
语法:
if(判断条件){动作指令;... ...}
4.2 双分支语句
语法:
if(判断条件){动作指令;... ...}else{动作指令;... ...}
统计系统用户个数和普通用户个数
4.3 多分支语句
语法:
if(条件1){动作指令;... ...}else if(条件2){动作指令;... ...}else{动作指令;... ...}
五.数组与循环
5.1 循环
语法:
for(变量 in 数值名){动作指令}
遍历数组:
变量是索引,数组[变量]是值。
成员关系判断:
5.2 for循环
语法:
for(表达式1;表达式2;表达式3){动作指令;... ...}
统计/etc/passwd中root出现次数。里面包含两层循环。第一层隐藏循环,awk遍历每一记录(行),显示循环遍历每一行的每一列。
5.3 while循环
语法:
while(条件){动作指令;... ...}
示例:
5.3 循环中断语句
与shell一样,awk提供了break,continue和exit语句,作用相同。
详细: awk命令详解_运维@小兵的博客-CSDN博客_awk