一. awk应用场景
格式化数据或从一个大的文本文件中抽取记录
二. 使用方法
命令行方式
$awk [-F field-separator] ‘commands’ input-file(s)
commands是真正的awk命令
[-F域分割符]是可选的,如果无-F选项,awk默认用空格作为分隔符,如果域分隔符不为空格,比如要浏览以”:”作为分隔符的password文件则必须指明-F选项,如:
awk -F: ‘commands’ input-file
awk脚本文件
将1中的命令行写入一个文件,用bash或sh去解释它,执行命令为
将所有awk命令写入一个文件awk_script_file,用$awk -f awk_script_file input-file(s),例如,
#record.txt
zhangsan 21 M Hubei
lisi 30 F Beijing
wangwu 34 M Anhui
wangmazi 50 M Sichuang
lilei 20 M Hubei
#awk_script_file
$2 > 30 {print $0}
$awk -f awk.sh record.txt
wangwu 34 M Anhui
wangmazi 50 M Sichuang
三. awk脚本组成
awk语句都是由模式和动作组成。
模式即动作的执行条件,可以是条件语句或正则表达式,模式包括2个特殊字段BEGIN和END。使用BEGIN语句设置计数和打印头。BEGIN语句在文本浏览之前执行。END语句用来在awk完成文本浏览动作后打印出文本总数和结尾状态。
动作大多数用来打印,在{}内指明,可以包含if和循环等,如果不指明动作awk将打印出所有浏览出来的记录。
域和记录
域即用分隔符分割的字段,用$1,$2,$3...,$n
表示第一个、第二个、第三个,第n个字段, $0
表示所有字段。
保存awk输出
$awk ‘$2 > 30 {print $1, $2}‘ record.txt > tmp.txt
动作中的正则表达式
动作中的正则表达式用表示方式为:/这则表达式/,域号匹配正则表达式用~后紧跟正则表达式,也可以用if()。例如,打印名字中包含“zhangsan”的所有记录,
$ awk ‘{if ($1~/zhangsan/)print $0}‘ record.txt
或
$ awk ‘$1~/zhangsan/‘ record.txt
#默认打印所有满足条件的字段
条件运算中常用的运算符和正则式
+, -, *, /, %, +=, -=, %=, ^=
++, --
~模糊匹配,即**包含**
!~不匹配
==精确匹配
>, <, >=, <=, !=
||, &&
正则表达式列举
[Gg]reen或(Green|green) 匹配Green或green
^...a 行首前三个字符任意,第四个是a
打印报告头和报告尾
awk ‘BEGIN{print "Name Age\n-------------------------"} $2>30 && $3 == "M" {print $1, $2} END {print "end-of-report"}‘ record.txt
awk内置变量
AGRC 命令行参数个数
ARGV 命令行参数列表
ENVIRON 系统环境变量
FNR 浏览文件的记录数
FILENAME 浏览文件名
FS 域名分隔符,等价于-F选项
NF 浏览记录域个数
NR 已读记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
awk内置字符串函数
gsub(r, s) 在整个$0中用s替代r
gsub(r, s, t) 在整个t中用s替代r
index(s, t) 返回s中字符串t的第一个位置
length(s) 返回s长度
match(s, r) 测试s是否包含匹配的r字符串
split(s, a, fs) 用fs把s分割成序列a
sprintf(fmt, exp) 返回经fmt格式化的串
substr(s, p) 返回字符串s中从p开始的部分
substr(s, p, n) 返回字符串s中从p开始长度为n的部分
awk变量
变量提高了awk程序可读性,下面是变量使用的简单例子
awk ‘{name=$1;age=$2;sex=$3;if(age>30 && sex=="M")print "Name:" name " Age:" age}‘ record.txt
修改数值域的值
#将姓名为"lilei"的年龄增加1,然后打印出所有记录
awk ‘{if ($1=="lilei") $2+=1;print "Name:"$1 " Age:"$2}‘ record.txt
#将姓名为"lilei"的姓名修改为"Lilei",打印出修改后的记录
awk ‘$1=="lilei" {$1="Lilei";print "Name:"$1 " Age:"$2}‘ record.txt
统计
awk ‘{(tot += $2)};END{print "Total age:" tot}‘ record.txt
本文只是简单的介绍了awk的基本语法,阅读本文后可以用awk完成简单的文本处理功能,awk博大精深,如果要深入学习建议阅读更专业的awk文档和相关书籍。
原文地址:http://blog.csdn.net/codingnote/article/details/44946593