文章目录
1. awk介绍
在计算内存使用率时,使用free -m
会输出一堆流,需要使用grep,str,cut
等命令去进行复杂的内容解析,最后再去计算使用率。
但使用awk就会自动解析内容,每行一条记录,每列一个属性。行与行之间以回车符进行解析,列之间默认以空格或者回车分割去解析。
2. awk基本用法
2.1 awk命令
awk [option] [BEGIN]{program}END [file]
命令选项
-F 指定一行中各个字段的解析符
awk -F: {print $1} data.txt #按冒号分隔去解析一行中的各个字段
-f 指定读取程序的文件名
-v 定义awk程序中使用的变量和默认值
awk程序运行优先级
1)BEGIN 在开始处理流之前进行,优先级最高,可选项
2)program 处理数据流,必选项
3)END 处理完数据流后的操作,可选项
2.2 awk基本语法
2.2.1 对列提取
$0 所有列
$1 第一列
....
$NF 最后一列
------------------------------
awk '{print $5}' data.txt #第5列
awk '{print $1,$3}' data.txt #第1和3列,默认输出按空格分割
awk '{print $1 "-" $3}' data.txt #第1和3列,输出按'-'分割
2.2.2 对行提取
awk 'NR==3{print $0}' data.txt #提取第三行所有列
awk -F ":" 'NR==1{print $0}' data.txt #提取第一行所有列,按:解析列
3. awk高级用法
3.1 awk程序运行优先级
awk 'BEGIN{print "hello"}{print $0}END{print "end"}' data.txt
1)BEGIN 在开始处理流之前进行,优先级最高,可选项
2)program 处理数据流,必选项
3)END 处理完数据流后的操作,可选项
3.2 awk定义数组
awk 'BEGIN{array[0]=100;array[1]=200;print array[0],array[1]}'
3.3 awk数学运算
- 赋值运算
- 比较运算
- 数学运算
- 逻辑运算
- 匹配运算
赋值运算
awk 'BEGIN{name="kkk";print name}'
比较运算
awk 'BEGIN{prnit "a" >= "b"}'
seq 1 10 > num
awk '$1>5{print $0}' num
数学运算
awk 'BEGIN{print 1+1}'
awk 'BEGIN{print 100/3}'
awk 'BEGIN{print 100>=2 $$ 100>=3}'
awk 'count=0' 'BEGIN{count++;print count}'
匹配运算
awk -F: '$1=="root"{print $0}' passwd
awk -F: '$1 ~ "ro"{print $0}' passwd #模糊匹配
3.4 环境变量
变量 | 描述 |
---|---|
FIELDWIDTHS | 以空格分隔的数字列表,用空格定义每个数据字段的精确宽度. |
FS | 解析数据列与列的分隔符 |
OFS | 输出列与列的分隔符 |
RS | 输入一行记录分隔符 |
ORS | 输出一行记录分隔符 |
awk 'BEGIN{FILELDWIDTHS="5 2 8"}NR==1{print$1,$2,$3}' /etc/passwd
awk 'BEGIN{FS=":"}$1 ~"ro"{print $0}'
awk 'BEGIN{FS=":";OFS="\n"}$1 ~"ro"{print $0}'
4. awk流程控制
awk '{if ($1<5)print $1*2;else print $1/2}' num
awk '{sum=0;for (i=1;i<4;++i){sum+=i}print sum}' num
5. awk使用小技巧
打印test文本行数
awk 'END{print NR}' test
打印test文本最后一行内容
awk 'END{print $0}' test
打印test文本列数
awk 'END{print NF}' test