awk总结

·awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。完整的awk脚本通常用来格式化文本文件中的信息。

·三种调用方式
1)awk  [option]  'awk_script'  input_file1  [input_file2 ... ]
awk的常用选项:
1> -F fs              : 使用fs作为输入记录的字段分隔符,如果省略该选项,awk使用环境变量IFS的值
2> -f  filename    : 从文件filename中读取awk_script
3> -v var=value  :  为awk_script设置变量

2)将awk_script放入脚本文件并以#!/bin/awk -f为首行, 给予该脚本可执行权限,然后在shell下通过键入该脚本名调用之

3)将所有的awk_script插入一个单独脚本文件,然后调用:awk -f walk脚本文件 input_file(s)


·正则表达式
1))正则表达式用作awk_pattern: /regexp/
① awk中正则表达式匹配操作中经常用到的字符:
\ ^ $ . [] | () * // 通用的regexp元字符
+ : 匹配其前的单个字符一次以上,是awk自有的元字符,不适用于grep或sed等
? : 匹配其前的单个字符1次或0次,是awk自有的元字符,不适用于grep或sed等
② 举例:
awk '/ *\$0\.[0-9][0-9].*/' input_file

2)布尔表达式用作awk_pattern,表达式成立时,触发相应的actions执行。
① 表达式中可以使用变量(如字段变量$1,$2等)和/regexp/

② 布尔表达式中的操作符:
关系操作符: < > <= >= == !=
匹配操作符: value ~ /regexp/ 如果value匹配/regexp/,则返回真
value !~ /regexp/ 如果value不匹配/regexp/,则返回真
举例: awk '$2 > 10 {print "ok"}' input_file
awk '$3 ~ /^d/ {print "ok"}' input_file

③ &&(与) 和 ||(或) 可以连接两个/regexp/或者布尔表达式,构成混合表达式。!(非) 可以用于布尔表达式或者/regexp/之前。
举例: awk '($1 < 10 ) && ($2 > 10) {print "ok"}' input_file
awk '/^d/ || /x$/ {print "ok"}' input_file

④ 其它表达式用作awk_script,如赋值表达式等
eg: awk '(tot+=$6); END{print "total points :" tot }' input_file // 分号不能省略
awk 'tot+=$6 {print $0} END{print "total points :" tot }' input_file // 与上面等效


·actions
actions就是对awk读取的记录数据进行的操作。actions由一条或多条语句或者命令组成,语句、命令之间用分号(;)分隔。actions中还可以使用流程控制结构的语句。
1) awk的命令:

① print 参数列表 : print可以打印字符串(加双引号)、变量和表达式,是awk最基本的命令。参数列表要用逗号(,)分隔,如果参数间用空格分隔,打印出时参数值之间不会有空格。

② printf ([格式控制符],参数) : 格式化打印命令(函数),语法与C语言的printf函数类似。

③ next : 强迫awk立刻停止处理当前的记录,而开始读取和处理下一条记录。

④ nextfile : 强迫awk立刻停止处理当前的输入文件而处理输入文件列表中的下一个文件

⑤ exit : 使awk停止执行而跳出。如果有END 存在,awk会去执行END 的actions。


·awk的语句: awk的语句主要是赋值语句,用来给变量赋值。
① 把直接值或一个变量值赋值给变量。如果直接值是字符串要加双引号。
举例: awk 'BEGIN {x=1 ; y=3 ; x=y ; print "x=" x " ; y=" y }'

② 把一个表达式的值赋值给变量。表达式一般是数值表达式,也可以是其它表达式。
数值表达式: num1 operator num2
operator可以是: +(加) -(减) *(乘) /(除) %(取模) ^(求幂)
当num1或者num2是字符串而是不是数字时,无论是否加有双引号,awk都视其值为0
条件选择表达式: A?B:C (A为布尔表达式,B和C可以是表达式或者直接值)
当布尔表达式A的值为真时,整个表达式的值为B,A的值为假时,整个表达式的值为C
举例: awk 'BEGIN {x=3 ; x+=2 ; y=x+2 ; print "x=" x " ; y=" y }'
awk 'BEGIN {x=3 ; y=x>4?"ok":4 ; print "x=" x " ; y=" y }'

③ 为了方便书写,awk也支持C语言语法的赋值操作符: += -= *= /= %= ^= ++ --

·流程控制结构 (基本上是使用C语言的语法)
其中condition一般为布尔表达式,body和else-body是awk语句块。
① if (condition) {then-body} [else {else-body}]

② while (condition) {body}

③ do {body} while (condition)

④ for (initialization; condition; increment) {body}
与C语言的for结构的语法相同。

⑤ break : 跳出包含它的for、while、do-while 循环

⑥ continue : 跳过for、while、do-while循环的body的剩余部分,而立刻进行下一次循环的执行。



·awk的变量
在awk_script中的表达式中要经常使用变量。不要给变量加双引号,那样做,awk将视之为字符串。awk的变量基本可以分为两类:
1) awk内部变量: awk的内部变量用于存储awk运行时的各种参数,这些内部变量又可以分为:
① 自动内部变量: 这些变量的值会随着awk程序的运行而动态的变化,在awk_script中改变这些变量的值是没有意义的(即不应该被赋值)。常见的有:
NF : 当前输入字段的字段数
NR : 对当前输入文件而言,已经被awk读取过的记录(行)的数目。
FNR : 已经被awk读取过的记录(行)的总数目。当输入文件只有一个时,FNR和NR是一致的。
FILENAME : 当前输入文件的文件名。
ARGC : 命令行参数个数。(不包括选项和awk_script,实际就是输入文件的数目加1)
ARGIND : 当前被处理的文件在数组ARGV内的索引( 实际上ARGV[1]就是第一个输入文件 )
举例: awk '{print NR,NF,$0} END {print FILENAME}' input_file
② 字段变量($0 $1 $2 $3 ...): 当awk把当前输入记录分段时,会对这些字段变量赋值。和内部变量类似,在awk运行过程中字段变量的值是动态变化的。不同的是,修改这些字段变量的值是有意义的,被修改的字段值可以反映到awk的输出中。
可以创建新的输出字段,比如,当前输入记录被分割为8个字段,这时可以通过对变量 $9 (或$9之后的字段变量)赋值而增加输出字段,NR的值也将随之变化。
字段变量支持变量名替换。
举例: pwd |awk -F/ '{print $NF}' // print $NF 打印输入记录的最后一个字段
awk '{x=2;print $x}' input_file // 打印输入记录的第2个字段
③ 其它内部变量: 可以修改这些变量。常见的有:
FS : 输入记录的字段分隔符(默认是空格和制表符)
OFS : 输出记录的字段分隔符(默认是空格)
OFMT : 数字的输出格式(默认是 %.6g)
RS : 输入记录间的分隔符(默认是NEWLINE)
ORS : 输出记录间的分隔符(默认是NEWLINE)
ARGV : 命令行参数数组
ENVIRON : 存储系统当前环境变量值的数组,它的每个成员的索引就是一个环境变量名,而对应的值就是相应环境变量的值。可以通过给ENVIRON数组的成员赋值而改变环境变量的值,但是新值只在awk_script内有效。eg: ENVIRON["HISTSIZE"]=500
举例: cat /etc/passwd | awk 'BEGIN { FS=":" } {print "User name: "$1,"UID: "$4}'

2) 自定义变量
1) 定义变量: varname=value (自定义变量不需先声明后使用,赋值语句同时完成变量定义和初始化)
2) 在表达式中出现不带双引号的字符串都被视为变量,如果之前未被赋值,默认值为0或空字符串。
3) 向命令行awk程序传递变量的值:
① Usage: awk 'awk_script' awkvar1=value1 awkvar2=value2 .... input_file
eg: awk '{if ($5 < ARG) print $0 }' ARG=100 input_file
② awkvar可以是awk内置变量或自定义变量。
③ awkvar的值将在awk开始对输入文件的第一条记录应用awk_script前传入。如果在awk_script中已经对某个变量赋值,那么在命令行上传人到该变量的值就会无效(实际上是awk_script中的赋值语句覆盖了从命令行上传入的值)。
④ 在awk脚本程序中不能直接使用shell的变量。通过使用下面的语法可达到这样的效果。
awk 'awk_script' awkvar1=shellvar1 awkvar2=shellvar2 .... input_file
eg: awk '{if (v1 == "root") {print "User name is root!"}}' v1=$USER input_file
⑤ 可以向awk脚本传递变量的值,与上面的类似。
awk_script_file awkvar1=value1 awkvar2=value2 ... input_file



·awk的内置函数
可以在awk_script的任何地方使用awk函数。和awk变量一样,awk函数可以分为内置函数和自定义函数。
1) 常见awk内置数值函数
int(x) : 求出x 的整数部份,朝向0 的方向做舍去。eg: int(3.9)是3,int(-3.9) 是-3。
sqrt(x) : 求出x 正的平方根值。eg: sqrt(4)=2
exp(x) : 求出x 的次方。eg: exp(2) 即是求e*e 。
log(x) : 求出x 的自然对数。
sin(x) : 求出x 的sine 值,x 是弪度量。
cos(x) : 求出x 的cosine 值,x 是弪度量。
atan2(y,x) : 求y/x 的arctangent 值,所求出的值其单位是弪度量。
rand() : 得到一个随机数(平均分布在0和1之间)。每次执行gawk,rand从相同的seed生成值。
srand(x) : 设定产生随机数的seed为x。如果在第二次运行awk程序时你设定相同的seed值,你将再度得到相同序列的随机数。如果省略引数x,例如srand(),则当前日期时间会被当成seed。这个方法可使得随机数值是真正不可预测的。
srand() : 其值是当次awk_script运行过程中前次srand(x)的设定的seed值x,。
2) 常见awk内置字符串函数
index(in, find) : 返回字符串in中字符串find第一次出现的位置(索引从1开始),如果在字串in中找不到字符串find,则返回值为0。eg: print index("peanut","an") 会印出3。
length(s) : 求出字符串s的字符个数。eg: length("abcde") 是5。
match(s,r) : 返回模式字符串r在字符串s的第一次出现的位置,如果s不包含r,则返回值0。
sprintf(fmt,exp1,...) : 和printf类似印出,是sprintf不是打印而是返回经fmt格式化后的exp。
eg: sprintf("pi = %.2f (approx.)",22/7) 传回的字串为"pi = 3.14 (approx.)"
sub(p, r,t) : 在字符串t中寻找符合模式字符串p的最靠前最长的位置,并以字符串r代替最前的p。
eg: str = "water, water"sub(/at/, "ith",str) 结果字符串str 会变成"wither, water"
gsub(p, r, t) : gsub与sub类似。不过时在字符串t中以字符串r 代替所有的p。
eg: str="water, water" ; gsub(/at/, "ith",str) 结果字符串str会变成"wither,wither"
substr(str, st, len) : 传回str的子字符串,其长度为len字符,从str的第st个位置开始。如果len没有出现,则传回的子字符串是从第st个位置开始至结束。
eg: substr("washington",5,3) 传回值为"ing"
substr("washington",5) 传回值为"ington"
split(s,a,fs) : 在分隔符fs为分隔符将字符串s分隔成一个awk数组a,并返回a的下标数。
eg: awk 'BEGIN{print split("123#456#789",myarray,"#")}' 将打印 3 。
tolower(str) : 将字符串str的大写字母改为小写字母。
eg: tolower("MiXeD cAsE 123") 传回值为"mixed case 123"
toupper(str) : 将字符串string 的小写字母改为大写字母。
eg: toupper("MiXeD cAsE 123")传回值为"MIXED CASE 123"
3) 常见awk内置系统函数
close(filename) : 将输入或输出的文件filename 关闭。
system(command) : 此函数允许调用操作系统的指令,执行完毕後将回到awk程序。
eg: awk 'BEGIN {system("ls")}'



·自定义函数
复杂的awk常常可以使用自己定义的函数来简化。调用自定义的函数与调用内置函数的方法一样。
1) 自定义函数定义的格式: 自定义函数可以在awk程序的任何地方定义。
function fun_name (parameter_list) { // parameter_list是以逗号分隔的参数列表
body-of-function // 函数体,是awk语句块
}
2) 举例:
awk '{ print "sum =",SquareSum($1,$2) }
function SquareSum(x,y) { sum=x*x+y*y ; return sum } ' grade.txt



·9.awk的数组
数组使用前,不必预先定义,也不必指定数组元素个数。
1) 访问数组的元素。经常使用循环来访问数组元素,下面是一种循环类型的基本结构:
for (element in array_name ) print array_name[element]
2) 举例: awk 'BEGIN{print split("123#456#789",mya,"#") ; for (i in mya) { print mya }} '

 » 相关连接:
[回复]
1.awk的常规表达式元字符

\ 换码序列
^ 在字符串的开头开始匹配
$ 在字符串的结尾开始匹配
. 与任何单个字符串匹配
[ABC] 与[]内的任一字符匹配
[A-Ca-c] 与A-C及a-c范围内的字符匹配(按字母表顺序)
[^ABC] 与除[]内的所有字符以外的任一字符匹配
Desk|Chair 与Desk和Chair中的任一个匹配
[ABC][DEF] 关联。与A、B、C中的任一字符匹配,且其后要跟D、E、F中的任一个字符。
* 与A、B或C中任一个出现0次或多次的字符相匹配
+ 与A、B或C中任何一个出现1次或多次的字符相匹配
? 与一个空串或A、B或C在任何一个字符相匹配
(Blue|Black)berry 合并常规表达式,与Blueberry或Blackberry相匹配

2.awk算术运算符

运算符 用途
------------------
x^y x的y次幂
x**y 同上
x%y 计算x/y的余数(求模)
x+y x加y
x-y x减y
x*y x乘y
x/y x除y
-y 负y(y的开关符号);也称一目减
++y y加1后使用y(前置加)
y++ 使用y值后加1(后缀加)
--y y减1后使用y(前置减)
y-- 使用后y减1(后缀减)
x=y 将y的值赋给x
x+=y 将x+y的值赋给x
x-=y 将x-y的值赋给x
x*=y 将x*y的值赋给x
x/=y 将x/y的值赋给x x%=y 将x%y的值赋给x
x^=y 将x^y的值赋给x
x**=y 将x**y的值赋给x

3.awk允许的测试:

操作符 含义

x==y x等于y
x!=y x不等于y
x>y x大于y
x>=y x大于或等于y
x<y x小于y
x<=y x小于或等于y?
x~re x匹配正则表达式re?
x!~re x不匹配正则表达式re?

4.awk的操作符(按优先级升序排列)

= 、+=、 -=、 *= 、/= 、 %=
||
&&
> >= < <= == != ~ !~
xy (字符串连结,'x''y'变成"xy")
+ -
* / %
++ --

5.awk内置变量(预定义变量)

说明:表中v项表示第一个支持变量的工具(下同):A=awk,N=nawk,P=POSIX awk,G=gawk

V 变量 含义 缺省值
--------------------------------------------------------
N ARGC 命令行参数个数
G ARGIND 当前被处理文件的ARGV标志符
N ARGV 命令行参数数组
G CONVFMT 数字转换格式 %.6g
P ENVIRON UNIX环境变量
N ERRNO UNIX系统错误消息
G FIELDWIDTHS 输入字段宽度的空白分隔字符串
A FILENAME 当前输入文件的名字
P FNR 当前记录数
A FS 输入字段分隔符 空格
G IGNORECASE 控制大小写敏感0(大小写敏感)
A NF 当前记录中的字段个数
A NR 已经读出的记录数
A OFMT 数字的输出格式 %.6g
A OFS 输出字段分隔符 空格
A ORS 输出的记录分隔符 新行
A RS 输入的记录他隔符 新行
N RSTART 被匹配函数匹配的字符串首
N RLENGTH 被匹配函数匹配的字符串长度
N SUBSEP 下标分隔符 "\034"

6.awk的内置函数

V 函数 用途或返回值
------------------------------------------------
N gsub(reg,string,target) 每次常规表达式reg匹配时替换target中的string
N index(search,string) 返回string中search串的位置
A length(string) 求串string中的字符个数
N match(string,reg) 返回常规表达式reg匹配的string中的位置
N printf(format,variable) 格式化输出,按format提供的格式输出变量variable。
N split(string,store,delim) 根据分界符delim,分解string为store的数组元素
N sprintf(format,variable) 返回一个包含基于format的格式化数据,variables是要放到串中的数据
G strftime(format,timestamp) 返回一个基于format的日期或者时间串,timestmp是systime()函数返回的时间
N sub(reg,string,target) 第一次当常规表达式reg匹配,替换target串中的字符串
A substr(string,position,len) 返回一个以position开始len个字符的子串
P totower(string) 返回string中对应的小写字符
P toupper(string) 返回string中对应的大写字符
A atan(x,y) x的余切(弧度)
N cos(x) x的余弦(弧度)
A exp(x) e的x幂
A int(x) x的整数部分
A log(x) x的自然对数值
N rand() 0-1之间的随机数
N sin(x) x的正弦(弧度)
A sqrt(x) x的平方根
A srand(x) 初始化随机数发生器。如果忽略x,则使用system()
G system() 返回自1970年1月1日以来经过的时间(按秒计算)

 » 相关连接:
 » 本栏目最新帖:
 » 精华帖:

Powered by PHPWind v6.0 Code © 2003-08