目录:

  1、awk功能

  2、常用awk内置变量

  3、awk正则匹配

  4、BEGIN和END语句块

  5、awk数组

  6、awk流程控制

  7、awk 引用外部变量

  8、awk常用使用案例

 

1、awk功能
通过一个简短的命令,我们来了解其工作原理:

# awk '{print $0}' /etc/passwd 
# echo hhh|awk '{print "hello,world"}' 
# awk '{ print "hiya" }' /etc/passwd

你将会见到/etc/passwd文件的内容出现在眼前,现在,解释 awk做了些什么;

调用awk时,我们指定/etc/passwd作为输入文件,执行awk时,它依次对/etc/passwd中的每一行执行print命令,所有输出都发送到stdout,所得到的结果与执行cat /etc/passwd完全相同;
现在,解释{ print }代码块,在awk 中,花括号用于将几块代码组合到一起,这一点类似于C 语言,在代码块中只有一条 print命令;
在awk 中,如果只出现print命令,那么将打印当前行的全部内容,再次说明,awk 对输入文件中的每一行都执行这个脚本;

 

 

 

 

2、常用awk内置变量

 

 

$0          当前记录 
$1~$n       当前记录的第n个字段 
FS          输入字段分隔符,默认是空格 
RS          输入记录分割符,默认为换行符 
NF          当前记录中的字段个数,就是有多少列 ,重点
NR          已经读出的记录数,就是行号,从1开始 ,重点
OFS         输出字段分隔符,默认也是空格 
ORS         输出的记录分隔符,默认为换行符 

 

# awk -F: 'BEGIN{OFS="#"}$1=="root"{print $1,$2,$3}' /etc/passwd    #输出$1=="root"的行,且把空格改为#连接
root#x#0

 

3、awk正则匹配

 

 

 

 

 示例:

# awk -F: '/^root/{print}' /etc/passwd               #以root开头的
# awk -F: '$1!~/root/{print}' /etc/passwd            #$1包含root字符串的

 

4、BEGIN和END语句块

通常对于每个输入行,awk都会执行每个脚本代码块一次; 然而,在许多编程情况中,可能需要在awk开始处理输入文件中的文本之前执行初始化代码;
对于这种情况,awk允许您定义一个BEGIN 块. 因为awk在开始处理输入文件之前会执行BEGIN块;
因此它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。
awk还提供了另一个特殊块,叫作 END块,awk在处理了输入文件中的所有行之后执行这个块;
通常,END块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。

语法格式:

# awk -F: 'BEGIN{语句块}{print}END{语句块}' /etc/passwd

 

5、awk数组
数组可以使用一个数组名称存储多个值,与普通变量不一样;
定义格式:数组名[下标]=值

# awk 'BEGIN{a[0]=100;print a[0]}'
# awk 'BEGIN{a[0]=100;a[1]=200;a[2]=300;for(i in a) print a[i] }'    #结合for循环,循环下标

 

6、awk流程控制
if语句:

# awk -F: '{if($3<=1000){i++} } END{print i}' /etc/passwd              #统计用户UID<=1000的用户,逐行处理
# awk -F: '{if($3<=1000){i++}else{j++} } END{print i,j}' /etc/passwd        #双分支

 

for语句:

# awk '{a[$1]++ END{for(i in a ){print i,a[i]}}}'    iptxt      #统计iptxt清单中每个IP地址出现的次数,用a[ip地址],也就是IP地址做为下标

 

7、awk 引用外部变量

# awk '{print res_ip," ",$0}' res_ip=$i temp.txt >>result.txt    #awk引用外部变量

 

8、awk常用使用案例

# ab -c 1 -n 50000 http://127.0.0.1/index.html          #每秒50000次的http请求压力测试
# sort -n txt5                             #升序排列,-n表示要比较整个数字,默认只按第1位排
# sort -r -n txt5                           #降序排列,-n表示要比较整个数字,默认只按第1位排
# awk -F '.' '{print $3"\t"$4"\t"$0}' prod_vm_ip.txt |sort -n -k 1 -k 2|awk '{print $3}'>prod_ip.txt    #awk 排序不同网段的IP地址

# uptime | awk '{print "cpu平均负载: "$10,$11,$12}'        #CPU负载
# free -m | awk '/^Mem/{print "主机剩余内存"$4"M"}'        #主机剩余内存
# df -h | awk '/vda1/{print "磁盘剩余空间: "$4}'          #磁盘剩余空间
# ifconfig eth0 | awk '/RX p/{print "网卡eth0接收的数据量是"$5"字节"}'
# awk '{x++}END{print "主机拥有的账户总数是:"x" 个"}' /etc/passwd

 

原文地址:http://www.cnblogs.com/reachos/p/16809154.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性