awk是一种处理文本数据的编程语言,它的设计使它非常适合于处理由行和列组成的文本数据。
1 基本语法
awk pattern { actions }
以上语法表示当某个文本行符合pattern指定的匹配规则时,执行actions所执行的操作。
两者必须保证有一个,如果省略pattern则表示对所有的文本行执行actions所表示的操作,如果省略actions表示将匹配成功的行输出到屏幕。
awk的匹配模式非常灵活,可以是一下任意一种:
正则表达式
关系表达式:如x>34
模式1 模式2
BEGIN
END
awk命令的操作由一个或多个命令、函数或者表达式组成,他们之间由换行符或者分号隔开,并且位于大括号内,通常有四种操作:
变量或者数组赋值
输出命令
内置函数
流程控制语句
注:awk命令的语法隐含一个条件结构,即如果符合匹配规则,则执行后面的操作。
2 awk工作流程
通过命令行:awk 'program-test' datafile
eg. awk '{ print }' scores.txt
通过awk脚本:awk -f program-file file...
eg. awk -f 1.awk scores.txt
注:awk脚本中不能含有除awk语句之外的其他命令或者语句
通过可执行文件
3 awk的模式匹配
关系表达式:
awk '$2 > 80 { print }' scores.txt // 第二列成绩超过80分
正则表达式:
放在两条斜线之间:/regular_expression/
awk '/^(Tom|Kon)/ { print }' scores.txt
混合模式:
支持使用逻辑运算符&& || !
awk '/^K/ && $2 > 80 { print }' score.txt
区间模式:可以匹配一段连续的文本行
pattern1,pattern2
awk '/^Nancy/, $2==92 { print }' scores.txt
//输出包含匹配前后两个模式在内的文本行之间的所有行
BEGIN模式:
成立的时机为awk程序刚开始执行,但是又尚未读取任何数据之前,该模式对应的操作仅仅被执行一次,当awk读取数据之后,BEGIN模式便不再成立。
#! /bin/awk -f
BEGIN {
FS="[\t:]"
RS="\n"
count=30
print "the report ..."
}
END模式:
在awk命令处理完所有数据,即将退出程序时成立。
END {
print "=========================="
print "printing is over"
}
4 变量
awk的变量名只能包括字母 数字 下划线,并且不能以数字开头,区分大小写。
awk中的变量类型分为两种,分别为字符串和数值。如果没有指定值,数值类型的变量默认值为0,字符串类型默认为空串。
BEGIN {
x=3
message="Hello" "world"
print x
print message
}
5 系统内置变量
$0:表示awk正在处理的记录
$n:当前记录的第n个字段的值
NF:当前记录的字段数
NR:表示已经读取的记录的数量
FS:用来表示字段分隔符,用户可以使用FS变量自定义当前数据文件的字段分隔符,awk会在处理文件数据前参考该变量的值来分隔记录中的各个字段。
RS:自定义数据文件中记录的分隔符,默认为换行符\n。
注:awk会在读取数据行之前通过FS及RS确定记录和字段的分隔符,然后进行记录和字段的分隔符,然后进行记录和字段的分隔。每读取一条记录之后,变量$0 $1 $2等变量都会自动更新。
6 记录分隔符和字段分隔符
指定记录分隔符:
eg1.
BEGIN {
#定义记录分隔符
RS=""
}
{
print #输出每行数据
print "================================="
}
注:当将记录分隔符指定为空字符串时,awk会将多个连续的空白行看做一个单一的记录分隔符,也就是说,awk不会再将空白行作为一条空白记录。另外,awk也会忽略文件开头和末尾处的空行。
eg2.
BEGIN {
#定义记录分隔符为空字符串
RS=""
#定义记录分隔符为换行符
FS="\n"
}
{ print $1 }
7 记录和字段的引用
用户可以使用系统变量来引用数据文件中的记录和字段。
awk每次只是读取一行文本,因此,在awk程序中记录和字段的引用都是针对当前记录来说的。