前言
什么是AWK
WK是一种处理文本文件的语言,是一个强大的文本分析工具。它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作数量,可以来自标准输入也可以是管道或文件
20世纪70年代诞生于贝尔实验室,现在centos7用的是gawk,之所以叫AWK是因为其取了三位创始人Alfred Aho,Peter Weinberger,和l Brian Kernighan 的 Family Name 的首字符。
工作原理:
当读到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出,如果没有定义匹配条件默认是匹配所有数据行,awk隐含循环,条件匹配多少次动作就会执行多少次。
逐行读取文木,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个"“字段"然后再进行处理。.awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。
在使用awk命令的过程中,可以使用逻辑操作符”&&“表示"与”、"||表示"或"、"!“表示非” ;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和次方。
awk内置变量
FS:指定每行文本的字段分隔符,缺省为空格或制表位
NF:当前处理的行的字段个数
NR:当前处理的行的行号(序数)
$0:当前处理的行的整行内容
$n:当前处理行的第n个字段(第n列)
FTLENAME:被处理的文件名
RS:行分隔符,awk从文件上读取资料室,价格根据RS的定义把资料切割成许多条记录,
而awk一次仅读入一条记录,以进行处理。预设值是“\n”
简说:数据记录分隔,默认为\n,即每行为一条记录
awk -F : '{print $1}' xy
##打印xy文本的第一列,并以:为分隔符
awk -F : '{print $1,$2}' xy
##打印xy文本的第一列和第二列,并以:为分隔符
用逗号分隔,显示有空格效果
awk -F: '/home/{print $0}' xy
##打印包含home的整行内容
awk -F: '/home/{print $1}' xy
##打印包含home的第一列
awk -F[:/] '{print NF}' xy
##统计以:和/作为分隔符,有多少列数
awk -F[:/] '{print NR}' xy
##显示行号
awk ‘NR==10’ xy
##显示第十行整行内容
awk -F: 'NR==10{print $1}' xy
##以:为分隔符,打印第十行的第一列
awk -F: 'NR==10{print $NF}' xy
##打印第十行的最后一列
awk 'END{print NR}' xy
##统计行数
ifconfig ens33 |awk '/netmask/{print $2}'
##打印本机IP地址
ifconfig ens33| awk '/RX p/{print $5}'
##打印当前流量
逐行执行开始之前执行什么任务,结束之后再执行什么任务,用"BEGIN、END"
BEGIN一般用来做初始化操作,仅在读取数据记录之前执行一次
END一般用来做汇总操作,仅再读取完数据记录之后执行一次
awk 'BEGIN{FS=":";OFS="---"}{print $1,$2}' xy
##OFS定义输出时以什么分隔,$1$2中间需要用逗号分隔,因为逗号默认被映射为OFS变量,而这个变量默认是空格
awk的运算
模糊匹配,用 ~ 表示包含, !~ 表示不包含
awk -F: '$1~/ro/{pring $2}' xy
##打印第一列包含ro的行的第二列,以:分隔
awk -F: '$1!~/ro/{pring $2}' xy
##打印第一列不包含ro的行的第二列,以:分隔
awk -F: '$1=="xy"' xy
##打印第一列等于xy的行
awk -F: '$3>=1000' xy
##打印第三列大于等于1000的行
awk -F: '$3<10 || $3>=1000' xy
##打印第三列小于10,或者第三列大于1000的行
awk -F: '$3>10 && $3<=1000' xy
##打印第三列大于10并且小于1000的行
awk 'NR>2 && NR<9' xy
##打印行号大于2小于9的整行
seq 200 | awk '$1%7==0 && $1~/7/'
##打印第一列除以7取余等于0且第一列包含7的行
awk '{print FNR,$0}' xy /etc/passwd
##分开显示俩个文件的行号,NR会按顺序显示俩个文本的行号,不会重新计算
awk 'BEGIN{RS=":"}{print $0}' xy
##每碰到一次:就换行继续显示
awk 'BEGIN{ORS=" "}{print $0}' xy
##把多行合并为一行,输出时以空格分隔每行,可自定义
awk高级用法
awk -v b="$a" 'BEGIN{print b}'
##将系统的变量a,在awk里赋值为变量b,然后再调用变量b
awk 'BEGIN{print "'$a'"}'
##直接调用需要先用双引号再用单引号
awk -vc=1 'BEGIN{print c}'
##awk直接定义并引用
调用函数getline,读取一行数据的时候并不是得到当前行而是当前行的下一行
awk -F: '{if($3<10){print $0}}' /etc/passwd ##打印第三列小于10的整行
awk -F: '{if($3<10){print $2}else{print $5}}' xy
##第三列小于10,打印第二列,否则打印第五列
awk还支持for循环,while循环,函数,数组等
awk 'BEGIN{x=0};/\/bin\/bash$/ {x++;print x,$0};END {print x}' /etc/passwd
##x=0是定义变量,/\/bin\/bash$/是以/bin/bash结尾的行,x++每次循环加1,print x,$0,打印每次循环的x值和整行内容,END结束操作 最后的print x表示统计一共有多少满足条件的行或者进行了多少次循环
grep -c "/bin/bash$" /etc/passwd ##统计以/bin/bash结尾的有多少行
三元运算符
awk -F: ‘{mak=($3>$4) ?$3:$4; {print mak}}’ xy ##$3>$4) ?$3:$4三元运算符,如果第三个列的值大于第四列的值,则把第三列赋值给max,否则将第四列赋值给max
awk -F: ‘($1~“root”) && (NF==7) {print $0}’ /etc/passwd
##第一列包含root且列数等于7,打印整行内容
通过管道、双引号调用shell命令
echo $PATH| awk ‘BEGIN{RS=":"};END {print NR}’
echo $PATH| awk ‘BEGIN{RS=":"};{print NR,$0};END {print NR}’
##统计以冒号分隔的文本段落数,END{}语句块中,往往会放入打印结果等语句
内存
查看当前内存使用百分比
free -m |awk '/Mem:/{print int($3/($3+$4)*100)"%"}'
free -m |awk '/Mem:/{print $3/$2}'0.327869
free -m |awk '/Mem:/{print $3/$2*100}'32.7869
free -m |awk '/Mem:/{print $3/$2*100}'32
free -m |awk '/Mem:/{print $3/$2*100}'
free -m |awk '/Mem:/{print int($3/$2*100)"%"}'32
free -m |awk ‘/Mem:/ {print $3/$2*100}’ | awk -F. ‘{print $1 “%”}’
top -b -n 1 |grep Cpu|awk -F ‘,’ ‘{print $4}’ | awk ‘{print $1}’ ##查看当前CPU空闲率,(-b -n 1表示只需要1此的输出结果)
date -d “$(awk -F “.” ‘{print $1}’ /proc/uptime) second ago”+"%F %H:%M:%S"
##显示上次系统重启时间,等同于uptime;second ago为显示多少秒前的时间。
总结
网络三剑客之awk的用法