awk介绍
awk是一种可以处理数据、产生格式化报表的语言,功能十分强大,awk认为文件中每一行是一条记录,记录与记录的分隔符为换行符,每一列是一个字段,字段与字段的分隔符默认是一个或多个空格或tab制表符。
awk的工作方式是读取数据,将每一行视为一条记录,每条记录以字段分隔符分成若干字段,然后输出各个字段的值
awk语法:awk [options][BEGIN]{program}[END][file]
常用命令选项:
-F fs 指定描绘一行中数据字段的文件分隔符,默认为空格
-f file 指定书读程序的文件名
-v var=value 定义awk程序中使用的变量和默认值
注意:awk程序脚本由左大括号和右大括号定义,脚本命令必须放置在两个大括号之间。
awk程序运行优先级是:
1) BEGIN:在开始处理数据流之前执行,可选项
2) program:如何处理数据,必选项
3) END:处理完数据流后执行,可选项
awk基本用法-awk数据提取功能
学习用例,数据源test.txt
1> awk对字段(列)的提取
字段提取:提取一个文本中的一列数据并打印输出
字段相关内置变量
$0 表示整行文本
$1 表示文本中的第一个数据字段
$2 表示文本中的第二个数据字段
$N 表示文本中的第N个数据字段
$NF 表示文本中的最后一个数据字段
1) awk '{print $0}' test.txt 读入text.txt每行数据并把每行数据打印出来
2) awk '{print $NF}' test.txt 读入text.txt每行数据并打印最后一列
3) awk '{print $3}' test.txt 读入text.txt每行数据并打印第三列
2> awk对记录(行)的提取
记录提取:提取一个文本中的一行并且打印输出
记录的提取方式有两种:a、通过行号b、通过正则匹配
记录相关内置变量
NR:指定行号
1) awk 'NR==3{print $0}' test.txt 获取test.txt第三行数据
2) awk -F ":" 'NR==1{print $1,$3,$5}' /etc/passwd 获取/etc/passwd第一行中第1、3、5列的数据,/etc/passwd中的字段以:作为分隔符,所以需要指定分隔符:
3> awk程序的优先级
关于awk程序的执行优先级,BEGIN是优先级最高的代码块,是在执行PROGRAM之前执行的,不需要提供数据源,因为不涉及到任何数据的处理,也不依赖与PROGRAM代码块;OROGRAM是对数据流做操作,是必选的代码块,也是默认的代码块,所以在执行的时候必须提供数据源;END是处理完数据流之后的操作,如果需要执行END代码块,就必须需要PROGRAM的支持,单个无法执行
1) awk 'BEGIN{print "hello lavender"}{print $0}END{print "bye lavender"}' test.txt
2) awk 'BEGIN{print "hello lavender"}' 不需要数据源 可以直接执行
3) awk '{print "hello lavender"}' awk 'END{print "hello lavender"}' 没有提供数据流,所以无法执行
4) awk '{print "hello lavender"}' test.txt
awk高级用法
1> awk定义数组
数组定义方式:数组名[索引]=值
awk 'BEGIN{array[0]=100;array[1]=200;print array[0],array[1]}'
awk中可以定义变量 head -2 /proc/meminfo |awk 'NR==1{t=$2}NR==2{f=$2;print (t-f)*100/t "%"}' 计算内存使用率
2> awk运算
1. 赋值运算 =
2. 比较运算 > >= == < <= !=
3. 数学运算 + - * / % ** ++ --
4. 逻辑运算 && ||
5. 匹配运算 ~ !~
1) 赋值运算,见上面的变量和数组定义
2) 比较运算 如果比较的字符串则按ascii编码顺序比较,如果结果返回为真则用1表示,如果返回为假则用0表示
3) 数学运算
4) 逻辑运算
5) 匹配运算
3> awk环境变量
FIELDWIDTHS 以空格分隔的数字列表,用空格定义每个数据字段的精确宽度
FS 输入字段分隔符号
OFS 输出字段分隔符号
RS 输入记录分隔符
ORS 输出记录分隔符号
awk 'BEGIN{FS=":";OFS="-"}$1=="root"{print $1,$3,$5}' /etc/passwd
4> 流程控制
1. if判断语句
2. for循环语句
3. while循环语句
4. do...while语句
5. 循环控制
学习用例;num.txt
1) 打印$1大于5的行
2) 累加
awk小技巧
1> 打印test.txt文本中的行数 awk 'END{print NR}' test.txt
2> 打印test.txt文本最后一行的内容 awk 'END{print $0}' test.txt
3> 打印test.txt文本中的总列数 awk 'END{print NF}' test.txt