shell脚本之awk


前言

什么是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的用法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值