@[工具,yoyoyang]
Awk是一种便于使用且表达能力强的程序设计语言,可应用于各种计算和数据处理任务。
awk调用方法
- 命令行
awk [-F field-separator] 'commands' input-file(s)
- shell脚本方式
#!/bin/sh
- awk脚本方式
#!/bin/awk
awk -f 脚本文件 待处理文件
起步上台
netstat命令中提取了如下信息:
tcp 0 0 127.0.0.1:80 0.0.0.0:* LISTEN
udp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN
tcp 0 0 10.1.48.196:5566 0.0.0.0:* FIN_WAIT2
tcp 0 0 10.1.48.196:80 0.0.0.0:* TIME_WAIT
- 输出第一列和第四列
cat netstat.txt | awk '{print $1, $4}' 或 awk '{print $1, $4}' netstat.txt
$0 当前记录(这个变量中存放着整个行的内容)
$1~$n 当前记录的第n个字段,字段间由FS分隔
脱掉外套
过滤记录
- 输出正在LISTEN的信息
cat netstat.txt | awk '$6=="LISTEN" {print $0}'
其中的“==”为比较运算符。其他比较运算符:!=, >, <, >=, <=
- &&, || 逻辑运算符
cat netstat.txt | awk '$6=="LISTEN" && $1=="tcp" {print $0}'
- AWK程序的结构 'pattern { action }', 模式-动作语句
字符串匹配
- 输出状态中保护WAIT的信息
cat netstat.txt | awk '$6 ~ /WAIT/ {print $0}'
- /WAIT/ 可以为一个正则表达式 /^WAIT/ 等
格式化输出
使用printf,和C语言的printf没什么两样;如:
cat netstat.txt | awk '{printf "%s, %s\n", $1,$4}'
脱掉衬衫
指定分隔符
jacky|8|1
yoyo|3|22
micou|4|10
hedy|5|20
bobo|2|9
salary.txt 为一天的工资单,包含员工的姓名、薪资(美元/小时)以及小时数
-
cat salary.txt | awk -F'|' '{print $1, $2}'
(-F指定分隔符) - 指定多个分隔符
awk -F '[;:]'
以分号;或冒号:指定分割
统计
- salary.txt 工资单,统计每个人所得薪资
cat salary.txt | awk -F'|' '{print $1, $2 * $3}'
- 计算所有人的工资总和
cat salary.txt | awk -F'|' '{s+=$2*$3} END {print s}'
END之后为读取完整改文件后,再去执行
脱掉内衣
控制语句
- if-else语句,计算时薪超过4美元的员工总薪酬和平均薪酬
cat salary.txt | awk -F'|' '{if($2 > 4){n+=1; pay=pay + $2 * $3}} END {printf "total pay is %s, average pay is %s\n", pay, pay/n}'
for循环
echo "3" | awk '{ for (i = 1; i <= $1; i = i + 1) print i }'
数组
3 5 6
2 3 1
4 5 6
此文件为num.txt, 求每一列的和
cat num.txt | awk '{for(i=1;i<=NF;i++) a[i]+=$i} END{for(i=1;i<=NF;i++) print i,a[i]}'
NF为环境变量,列的个数
几个花活
获取ifconfig中的ip地址
ifconfig eth0 | grep "inet addr" | awk '{print $2}' | awk -F':' '{print $2}'
打印99乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
自己撸吧
关于其中的一些知识点可以参看
- awk 正则表达式、正则运算符详细介绍 http://www.cnblogs.com/chengmo/archive/2010/10/11/1847772.html
- awk 内置变量 http://blog.csdn.net/gaoming655/article/details/7386630