首页 > 代码库 > Linux命令详解之mawk
Linux命令详解之mawk
pattern scanning and text processing language
语法:
mawk [-F value] [-v var=value] [--] ‘program text‘ [file...]
mawk [-F value] [-v var=value] [-f program-file] [--] [file...]
描述:
awk是一种文本数据处理语言,而mawk是针对这种语言的一种解释器。
awk程序由pattern{action}序列及函数定义组成。输入的数据根据RS(Record seperator,默认=‘\n’)划分为逐个的记录,每个记录均与pattern进行比较,若匹配,执行相应action。
选项:
-F
设置field seperator,FS,根据该值将record分为field
-f
awk程序文件
-v var=value
设置程序变量
--
指示mawk命令的选项说明结束
下面介绍AWK语言
1,程序结构
前面提到,awk程序由pattern{action}序列或函数定义组成。
其中,pattern可以是
BEGIN
END
expression
expression, expression
若action省略,隐含执行print,若pattern省略,则隐含为匹配正确。
语句根据换行符及分号判断为结束。
使用#进行注释
控制流包括
if(expr) statement
if( expr ) statement else statement
while ( expr) statement
do statement while (expr)
for(opt_expr ; opt_expr; opt_expr) statement
for(var in array) statement
continue
break
2,数据类型,转换和比较
有数值类型及字符串类型两种,其中,所有数字都用浮点数进行表示并完成计算。
3,正则表达式
expr ~ /r/
正则表达式用斜线括住,若expr服从该正则表达式,则为真,否则为假。不服从用“!~”表示。
/r/ {action}与$0 ~ /r/ {action}等价。
4,Records与Fields
一次读一行,即一个Records,并根据FS划分为Fields,$0表示整个Records,$1,$2,...,$NF分别代表对应的Field,内置变量NF为field的总数,高于NF的Fields设置为“”
NR及FNR每次增加1,所代表含义后文中有说明。
给上述内置变量赋值,会导致相关变量发生变化。
5,表达式和操作符
与C语言中操作符大部分一致,特殊的有in(array membership)、~(!~,matching)、$(field)。
6,数组
awk提供一维数组,使用A[1]或A["1"]访问元素
delete array[expr]会删除相应元素
if( ( i, j) in A ) print A[i, j]
7,内置变量
CONVFMT:数值到字符串的内部转换格式,默认=“%.6g”
ENVIRON:环境变量数组,var=value被存储为ENVIRON[var]=value
FILENAME:当前输入文件的名字
FNR:在FILENAME文件中的当前记录序号
FS:field分隔符,可以是正则表达式
NF:当前记录的field总数
NR:在所有输入流中的record number
OFMT:输出数值格式,默认为“%.6g”
OFS:输出时采用的field分隔符,默认为空格
ORS:输出时record分隔符,默认为换行符
RS:输入时的record分隔符,默认为换行
SUBSEP:used to build multiple array subscripts,默认为“\034”
8,内置函数
(1)字符串处理函数
gsub(r, s, t) gsub(r, s)
将t变量中匹配r的字符替换为s,若未指明t,则隐含为$0。最后返回替换数量。
index(s, t)
返回s中t第一次出现的位置,否则返回0,s的第一个字符下标为1
length(s)
返回s的长度
match(s,r)
返回s中r的最长匹配下标,无匹配返回0.
split(s,A,r) split(s,A)
根据r将s划分至A,并返回fields数量,若未设定r,则使用FS
sprintf(format, expr-list)
根据format构造字符串
sub(r,s,t) sub(r,s)
只完成一次替换
substr(s,i,n) substr(s,i)
返回s由i至长度为n的子字符串
tolower(s)
toupper(s)
(2)数值处理函数
atan2(y,x)
cos(x)
exp(x)
int(x)
log(x)
rand()
sin(x)
sqrt()
srand(expr) srand()
9,输入与输出
输出有print与printf
输出$0
print expr1, expr2, ... , exprn
printf format, expr-list
输入为getline
getline
读入一行至$0
getline < file
从file中读入$0
getline var
读下条记录至var
getline var < file
从file中读取下一条record至var
command | getline
执行command,并从管道中读取一条record至$0
command | getline var
执行command,并从管道中读取一条record至var
getline遇到end-of-file时,返回0,错误返回-1,正确返回1
close(expr)
关闭与expr联系的file或pipe
fflush(expr)
system(expr)执行expr,并返回状态
10,用户自定义函数
语法为
function name (args) {statements}
可以包含return opt_expr
11,分割字符串,记录,文件
12,多行records的处理
13,程序执行
首先会执行BEGIN
然后逐个根据中间的pattern{action}处理各个record
其中可以通过
next
exit opt_expr
改变pattern级别的程序执行顺序,碰到next直接read下一条record,并从BEGIN之后继续执行;exit立即调用END对应的actions,opt_expr为退出码。
最后执行END
Linux命令详解之mawk