awk:(Aho,Weinberger,Kernighan)报告生成器,格式化文本输出
awk版本:New awk(nawk),GNU awk( gawk) Linux使用GUN awk
data]# which awk
/usr/bin/awk
[root@centos7-17 data]# ll /usr/bin/awk
lrwxrwxrwx. 1 root root 4 Aug 5 17:28 /usr/bin/awk -> gawk
awk 是gawk的软链接
awk读入一行文本处理一行文本,遍历整篇文章,默认以空白为分隔符将一行文本分成多个域,依次赋给$1,$2,$3…
awk支持标准输入,因此支持管道
awk使用的基本格式:awk [opt] ‘program’ file
# awk 的常用示例
# ①取tcp连接状态
netstat -tan|awk '/^tcp/{state[$NF]++}END{for(i in state)print i,state[i]}'
ss -tnl | awk 'NR>1 {state[$1]++}END{for(i in state) print i,state[i]}'
# ②取磁盘空间利用率
df | awk -F '[ %]+' '/^\/dev\/sd/{if($5>80)print $1,$5}'
df | awk -F '[ %]+' '/^\/dev\/sd/{print $1,$5}'
df | awk '/^\/dev\/sd/{print $1,$5}'
# ③计算1+2+3+...+100
awk 'BEGIN{sum=0;for(i=1;i<=100;i++){sum+=i;}print "sum="sum}'
awk的分割符、域和记录
awk的常用选项
-F “分隔符1|分隔符2” : 指明分割字段时的分割符
指明时支持使用pattern,同时指明多个分隔符
-v var=value :变量赋值,一次变量赋值一个
-f file :可以将awk的program写在文件中-f指定执行即可<多次执行的program>
awk的内置变量
FS:输入字段分隔符,默认为空白字符
OFS:输出字段分隔符,默认为空白字符
RS:记录分割符,默认为’\n’
ORS:输出记录分割符,默认为’\n’
NF:字段数量
NR:记录号,如果默认RS,相当于加行号
FNR:各文件分别统计记录号,如果默认RS,awk同时处理多文件时,FNR对其文件分别加行号
FILENAME:当前文件名
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数
ARGV[0]=awk
ARGV[1]=file1 …
awk中程序的语法与C语言类似
c语言中argc与agrv表示:
main函数的参数,解释如下:
argc:命令行总的参数的个数,即argv中元素的格式。
*argv[ ]:字符串数组,用来存放指向你的字符串参数的指针数组,每一个元素指向一个参数。
argv[0]:指向程序的全路径名。
argv[1]:指向在DOS命令行中执行程序名后的第一个字符串。
argv[2]:指向第二个字符串。
awk支持自定义变量
PATTERN:根据pattern条件,过滤匹配的行,再做处理
(1)如果未指定:空模式,匹配每一行
(2) /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来
(3) relational expression: 关系表达式,结果为“真”才会被处理
真:exp结果为非0值,非空字符串
假:exp结果为空字符串或0值
seq 3 | awk 'i=!i'
默认 awk 'i' i未定义i=0
akw '!i' ==> !i=1
seq 10 | awk '{i=!i;print i}'
常用的action分类
条件表达式(三目表达式)(三元表达式)
selector?if-true-expression:if-false-expression
其中算术表达式,比较表达式,if,while,for均采用c语言语法使用
for的特殊语法:遍历数组中的元素
for(var in array) {for-body}
awk控制语句 ==> { statements;… } 组合语句
awk默认有行的循环, { statements;… } 组合语句 主要是控制行内循环
特殊的循环控制语句:
next:提前结束对本行处理而直接进入下一行处理(awk自身循环)
awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd
awk数组
高级用法示例:
1、取出磁盘分区利用率大于80%的分区和利用率
可再结合Linux命令实现广播
df | awk -F '[ %]+' '/^\/dev\/sd/{if($5>80)print $1,$5}'
2、计算1+2+3+...+100,使用time比较性能
awk:time awk 'BEGIN{sum=0;for(i=1;i<=100000;i++){sum+=i;}print "sum="sum}'
CMD:time (seq -s + 100000 |bc)
for:time (for((sum=0,i=1;i<=100000;i++));do let sum+=i; done; echo $sum)
3、awk去除重复行 <在awk中,变量未定义时为0>
awk '!line[$0]++' dupfilename
awk '{!line[$0]++;print $0, line[$0]}' dupfilename <去重原理>
4、取网络连接状态
netstat -tan|awk '/^tcp/{state[$NF]++}END{for(i in state)print i,state[i]}'
awk函数
1)数值处理函数:
2)字符串处理函数:
length(str):返回指定字符串的长度
sub(r,s,str):对字符串str搜索r表示模式匹配的内容,并将第一个匹配内容替换为s
gsub(r,s,str):字符串str进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容
split(str,array,[r]):以r为分隔符,切割字符串str,并将切割后的结果保存至array所表示的数组中,第一个索引值为1,第二个索引值为2,…
3)自定义函数:
awk中调用shell命令
例:
awk 'BEGIN{system("hostname") }'
awk 'BEGIN{score=100; system("echo your score is " score) }'
awk脚本
传递参数需注意:在BEGIN过程中不可用。直到首行输入完成以后,变量才可用。
可以通过-v 参数,让awk在执行BEGIN之前得到变量的值。命令行中每一个指定的
变量都需要一个-v参数。
#!/bin/awk -f
print格式:print item1, item2, …
print输出:
与printf命令用法一样。
printf格式化输出:printf “FORMAT” ,item1,item2…
格式符:与item一一对应
修饰符