文章目录
- 1. 基础用法
- 2. awk字符获取和筛选
- 获取CPU/MEM占用率
- 将awk指令包封脚本
- 3.awk条件与循环语句
- 4.awk调用函数
1. 基础用法
操作粒度更加精细,可以以特殊字符(: = 空格等)分割为列再进一步操作。例如 ps -aux获取到自己的进程后想进一步操作就可以使用awk指令。
awk 'BEGIN {commands} pattern {commands}END{commands}' filename
BEGIN:处理数据前执行的命令
END:处理数据后执行的命令
pattern:模式,每一行都执行的命令
BEGIN和END里的命令只是执行一次
pattern里的命令会匹配每一行去处理
awk '{print $0}' test.txt
* $0为全部行,$1为每行第一个列,$2为第二个列....
awk -F':' 'NR>20' test.txt
* NR在awk中代表行号
* -F指定’:‘为每行中的字段的分隔符。不指定默认为空格或者TAB。
awk -F':' 'NR>20' test.txt
* NR:行号
- 使用管道配合grep将user的线程提取并输出到test.txt
awk '{print NF}' test.txt
awk "{print $NF}' test.txt
* NF:统计每一行总字段数,$NF,输出每一行最后一个字段的值
awk "{print $(NF-1)}' test.txt
* 打印倒数第2个字段
awk -F: '/root/{print $0)' /etc/passwd
* 以:为分割,打印包含root的全部行;
* 把$0换$1,则会打印首列内容
2. awk字符获取和筛选
awk -F: 'BEGlIN{print "hello"}{i+=1; print $1}END{print i; print "goodbye"}' passwd
//begin:正式文本处理前执行的
//中间:针对每一行执行的指令,打印第一列,并借助i统计行数
//end:执行完毕后输出的
//begin、end可以省略,直接对每一行执行中间的部分awk -F:'$4 > $3{print $0}'/etc/passwd
//'$4 > $3是一个限制条件,第四列大于第三列才打印awk -F: '/bash/{print $0}' /etc/passwd
//只要行中包含bash则打印awk -F: '$NF ~/bash/{print $0}' /etc/passwd
//$NF表示每行的最后一个字段
//每行的最后一个字段是bash则打印
//~表示等于awk -F '$NF !~ /bash/{print $0}' /etc/passwd
//每行的最后一个字段不是bash则打印awk -F:'$3+$4>2000 && $3*$4>2000{print $0}'/etc/passwd
//&&表示逻辑与awk -F: '$3+$4>2000 || $3*$4>2000{print $0}' /etc/passwd
//||表示逻辑或awk -F: !($3 + $4>2000){print $0}' /etc/passwd
//!表示逻辑非awk -F':' '{(sum+=$4)} END {print sum}' ps.txt
//将第四列内容求和
获取CPU/MEM占用率
如下,第四列代表MEM使用率
将awk指令包封脚本
再用如下指令调用执行即可
awk -f command.awk passwd
3.awk条件与循环语句
awk -F":" '{if($3 ==0 ){print $1"is super user";}elseif($3>1&&$3<=999) {print $1"is system user"; }else {print $1" iscommon user"}'} passwd
//指令太长,所以写到脚本里面增强可读性,参考下图
//passwd是目标文件
awk -F: '{for(i=10;i>0;i--){print $0}}' passwd
//基于for循环每行打印10次awk -F: '{i=1;while(i<10){print $0, i++}}' passwd
//基于while循环每行打印10次awk -F:'{if(NR%5==0){print "----------"}print $0}' passwd
//$0打印每一行,每隔5行打印分割符
4.awk调用函数
- substr:精确提取子字符,有三个参数。如下图所示,$2代表默认使用空格分割的第2列大字符串,4代表大字符串中的第4个字符,2表示从第四个字符开始(包含第4个字符),共计取2个单字符。
- 指令的含义是从beacon.log中提取第18分钟发生的全部info信息
- 将$0替换为$2可以打印第2列内容,即具体是18分多少秒的信息
length:获取字符串中单字符的个数