1.awk 'parttern {action}' filename
从文件中逐行读取并匹配parttern,若匹配成功执行action否则读取下一行.
parttern和action都可选,若省略parttern则对每行都执行action.BEGIN和END不能省略action.
parttern {action}语句,及action内的语句通常用换行符分隔,若干语句在同一行时用分号分隔.
左大括号{必须与parttern在同一行,右大括号}位置不限.其中的空行被忽略.
空格与制表符可以成对出现在运算符与操作数周围以提高可读性.
#注释任一行.
2.当前输入行的第一个字段为$1,第二个字段为$2...当前行为$0.字段默认分隔符为空格或制表符.
3.在print语句中默认以逗号分隔表达式,{print $1,$2}
4.内置变量不需通过$引用
NF:Number of Field,每行的字段数.$NF可以表示最后一个字段值.
NR:Number of Record,到目前为止读取到的记录(行)数.
FNR:当前输入文件的记录个数.
FS:Field Separator,(输入行)字段分隔符.默认为空格.
OFS:Output Field Separator,输出行字段分隔符.默认为换行符(
).
RS:Record Separator:输入行分隔符.默认为换行符.
ORS:Output Record Separator:输出行分隔符.默认为空格.
ARGC:命令行参数的个数.
ARGV:命令行参数数组.
FILENAME:当前输入文件名.
OFMT:数值的输出格式,默认为%.6g
RLENGTH:被函数匹配的字符串的长度.
RSTART:被函数匹配的字符串的开始.
SUBSEP:下标分隔符.默认为 34.
5.parttern汇总
BEGIN {action}:在输入行被读取之前执行action一次.
END {action}:在输入行读取完成之后执行action一次.
expression {action}:若expression为真则输入行执行action,否则跳过.
/regexpr/ {action}:若输入行匹配正则表达式则执行action,否则跳过.
compexpr {action}:若复合表达式(由&&、||、!、())为真则输入行执行action,否则跳过.
parttern1,parttern2 {action}:对匹配parttern1开始到匹配parttern2结束的其间所有行(含这两行)执行action.若parttern2未匹配则从parttern1到末行执行action.
BEGIN和END不与其他模式组合,一个范围模式不能是其他模式的一部分.
6.BEGIN常用来更改FS,或打印标题.END用来输出计算结果.
7.比较运算符
< 小于
<= 小于等于
== 等于
!= 不等于
> 大于
>= 大于等于
~ 匹配
!~ 不匹配
8.字符串匹配模式:测试一个字符串是否包含一段可以被正则表达式匹配的子字符串.
/regexpr/:当前输入行包含一段能够被rexexpr匹配的子字符串时该模式被匹配.
expression ~ /regexpr/:若expression的字符串值包含一段能被rexexpr匹配的子字符串时该模式被匹配.
expression !~ /regexpr/:若expression的字符串值不包含一段能被rexexpr匹配的子字符串时该模式被匹配.
9.action汇总
expression:常量,变量,赋值,函数调用等
print expression-list
printf(format,expression-list)
if (expression) statements
if (expression) statements else statements
for (expression1;expression2;expression3) statements
for (expression in array) statements
while (expression) statements
do statements while (expression)
break
continue
10.内建函数
int(x) x的整数部分
sqrt(x) x的方根
rand() 返回一个[0,1)的随机数
srand() x是rand()新的随机数种子
sin(x) 正弦
cos(x) 余弦
log(x) 自然对数
exp(x) 指数
11.内建字符串函数
gsub(r,s) 将$s0中所有r替换为s,返回替换次数
gsub(r,s,t) 将字符串t中所有r替换为s,返回替换次数
sub(r,s) 将$0中最左最长能被r匹配的子字符串替换为s,返回替换次数
sub(r,s,t) 把t的最左最长能被r匹配的子字符串替换为s,返回替换次数
index(s,t) 返回字符串t和s中第一次出现的位置,若未出现则返回0
length(s) 返回s包含字符的个数
match(s,r) 测试s是否包含能被r匹配的子串,返回子串的起始位置或0
split(s,a) 用默认的FS将s分割到数组a中,返回字段个数
split(s,a,fs) 用指定的fs将s分割到数组a中,返回字段个数
sprintf(fmt,expr-list) 根据格式字符串fmt返回格式化后的expr-list
substr(s,p) 返回s中从位置p开始的后缀
substr(s,p,n) 返回s中从位置p开始的长度为n的子字符串
12.表达式运算符
拼接 (字符串拼接,不存在显示拼接运算符eg:"a" "bc"结果是"abc")
赋值 =、+=、-=、=、/=、%=、^=
条件表达式 ?:
逻辑 &&、||、!
关系运算 <、<=、==、!=、>=、>
数组匹配 i
四则 +、-、、/、%
13.数组
Awk数组元素的下标是字符串,eg:Array["string"]
14.函数
function name([parameter-list]) {
statements
[return expression]
}
[parameter-list]和[return expression]可选,若没有return则返回值是未定义的.
用户定义的函数可以在任何parttern-action语句的任何表达式中使用,也可以出现在任何函数体内部.
每个对函数的使用都叫一个调用call,用户自定义函数调用了自己就是递归recursive.
一个带有参数$1的函数被调用时($1只是一个普通的变量),函数接收到的参数是变量的值的一份拷贝, 所以函数操作的是变量的拷贝,而不是变量本身.这意味着函数不会对函数体外部的变量的值产生
影响.(用行话来说, 这样的变量叫做"标量", "按值传递" 给函数)
当数组作为函数的参数时,函数接收到的参数就不是数组的拷贝,所以函数可以改变数组的元素,或往数组增添新的值(这叫作"按引用传递"). 函数名不能当作参数使用.
在函数体内部的变量都是局部变量,只在函数执行时才存在.
14.输出
print 将$0打印到标准输出
print exp1,exp2... 打印exp1,exp2之间由OFS分隔,ORS终止
print exp1,exp2...>filename 输出至文件filename
print exp1,exp2...>>filename 累加输出到文件filename中,不覆盖之前的内容
print exp1,exp2... | cmd 输出到管道
printf(fmt,exp1,exp2...)
printf(fmt,exp1,exp2...)>filename
printf(fmt,exp1,exp2...)>>filename
printf(fmt,exp1,exp2...) | cmd
close(fillename),close(cmd) 断开print与filename或cmd之间的连接
system(cmd) 执行cmd,返回值是cmd的退出状态
15.输入
awk 'parttern {action}' filename 从文件filename读取
cmd | awk 'parttern {action}' 从管道读取
函数getline从当前输入行、文件、管道读取输入.getline抓取下一个记录,按照通常的方式把记录分割成一个个的字段.它会设置NF,NR和FNR;若存在一个记录则返回1,若遇到文
件末尾则返回0, 发生错误时返回-1(例如打开文件失败).
p66未完待续