7.1 变量
7.1.1 数字和字符串常量
在awk中,变量不需要定义就可以直接使用,使用一个变量就是对变量的定义。变量的类型可以是数字,字符串,或者两者都是。在赋值的时候,等号右边表达式的类型就是变量的类型。
7.1.2 自定义变量
自定义变量由字母,数字和下划线组成,但是不能以数字开头。Awk中的变量不需要声明。Awk根据表达式中的变量。如果变量没有初始化,awk就初始化字符串变量的值为NULL,数值变量值为0。如果有必要,awk能把数字变量转换为字符串变量,或者相反。变量通过赋值符号被赋值
赋值符号
符号 | 含义 | 等价形式 |
= | a=5 | a=5 |
+= | a=a+5 | a+=5 |
-= | a=a-5 | a-=5 |
*= | a=a*5 | a*=5 |
/= | a=a/5 | a/=5 |
%= | a=a%5 | a%=5 |
^= | a=a^5 | a^=5 |
递增和递减操作符
递增操作符用于在操作数上加1。表达式x++等价于x=x+1.类似的,递减操作符的作用是在操作数上减少1。表达式x-等价于x=x-1.
命令行自定义变量。可以在命令行中给变量赋值,然后再把这个变量传输给awk脚本。
-v选项(awk)。Awk的-v选项允许BEGIN语句处理命令行参数。对于每一个从命令行传输的参数,他们前面都必须有-v选项。
域变量。域变量的用法类似于自定义变量,只是域变量引用的域不同。
内建变量。内建变量的名字是由大写字母组成。他们事先被赋值并可以在表达式中使用。
内建变量清单
变量名 | 变量内容 |
ARGC | 命令行参数的数量 |
ARGIND | 命令行正在处理的当前文件的AGV的索引(仅在gawk中有效) |
ARGV | 命令行参数数组 |
CONVFMT | 转换数字格式(仅在gawk中有效),默认%.6g |
ENVIRON | 从shell传递来的包含当前环境变量的数组 |
ERRNO | 当使用close函数或者通过getline函数读取的时候,发生的重新定向错误的描述信息九保存在这个变量中(仅在gawk中有效) |
FIELDWIDTHS | 在对记录进行固定域宽的分割时,可以替代FS的分割符的列表(仅在gawk中有效) |
FILENAME | 当前的输入文件名 |
FNR | 当前文件的记录号 |
FS | 输入域分割符,默认是空格 |
IGNORECASE | 在正则表达式和字符串操作中关闭大小写敏感(仅在gawk中有效) |
NF | 当前文件域的数量 |
NR | 当前文件的记录数 |
OFMT | 数字输出格式 |
OFS | 输出域分割符 |
ORS | 输出记录分割符 |
RLENGTH | 通过match函数匹配字符串的长度 |
RS | 输入记录分割符 |
RSTART | 通过match函数匹配字符串的偏移量 |
RT | 记录结束符在输入文本的时候,gawk把它设为与RS相同 |
SUBSEP | 下标分割符 |
7.1.3 BEGIN模块
BEGIN模块后面紧跟着动作块,这个动作块在awk处理任何输入文件行之前执行。事实上,BEGIN块可以在没有任何输入文件的条件下测试,因为在BEGIN块执行完毕以前awk不读取任何输入文件。BEGIN块通常被用来改变内建变量的值,例如OFS,RS以及FS等等。初始化自定义变量的值;以及打印输出标题
例子:awk ‘BEGIN{FS=”:”; OFS=”t”; ORS=”nn”}{print $1,$2,$3}’ file
在处理输入文件以前,域分割符(FS)被设置为冒号,输出文件分隔符(OFS)被设置为制表符,输出记录分隔符(ORS)被设置为两个换行符。如果在动作模块中有多个语句,那么他们之间应该用分号分割,或者写在不同的行上(在命令行环境下用反斜杠转义换行符)。
7.1.4 END模块
END模块不匹配任何输入文件,但是执行动作块中的所有动作,END模块在整个输入文件处理完毕后被处理。
7.2 重新定向和管道
7.2.1 输出文件的重新定向
当使用>的时候,文件就被打开并截断;一旦文件被打开,直到文件被明确地关闭或者awk程序终止,它都会一直保持被打开的状态。来自后面的打印语句的输出会追加到前面内容的里面。
符号>>用来打开一个文件但是不清空文件。重新定向的输出只是被追加到这个文件的后面。
7.2.2 输入重新定向(getline)
getline函数的作用是从标准输入,管道或者当前正在处理的文件之外的其他输入文件获得输入。它负责从输入获得下一行的内容,并给NF,NR和FNR等内建变量赋值。如果得到一个记录,getline函数就返回1,如果到达文件的末尾就返回0。如果出现错误,例如打开文件失败,就返回-1.
7.3 管道
如果你在awk程序中打开一个管道,那么在打开下一个管道之前必须关闭它。管道符号右边可以通过双引号关闭管道。在同一时刻只能有一个管道存在。
7.4 关闭文件和管道
如果你打算在awk程序中再次使用文件,管道来进行读或者写,则先要关闭它,因为知道脚本结束它都不会自动关闭。一旦打开,管道就保持开的状态直到awk退出。所有END模块中的语句对管道也是有效的,END模块的第一行语句就是关闭管道。
System函数。内建的system函数把Linux命令作为参数执行这些命令,然后返回退出状态值给awk程序。
fflush函数
7.6 条件语句
7.6.1 if语句
以if开头的语句结构是动作语句。通过条件模块,If可以被隐含。通过条件动作语句,可以清楚地说明if 用法,If后面紧跟的语句必须放在括号内。如果括号内的表达式的值是真(非0或者非空),就执行紧跟着的语句或者语句块。如果执行语句多于一条,那么每条语句都需要以分号表示结束,且所有语句需要放在一对花括号中间,以便作为一个整天执行。
If (expression){
Statement;statement;…
}
7.6.2 if/else语句
if/else语句可以做双重判断。如果if关键字后面的表达式为真,那么跟这个表达式捆绑在一起的语句就被执行。如果If表达式的结果是假或者0,那么关键字else后面的语句块就被执行。如果If和else包含多条语句,那么就需要用一对花括号把它们括在以前,作为一个语句块。
{ if (expression){
statement; statement; …
}
else{
statement; statement;…
}
}
7.6.3 if/else else if 语句
if/else else if 语句可以做多重判断。
{ if (expression){
statement; statement; …
}
else if (expression) {
statement; statement; …
}
else if (expression) {
statement; statement; …
}
else {
statement;
}
}
7.7 循环
7.7.1 while循环
使用while循环的第一步是设置变量的初试值。这个值将在while表达式中被测试。如果表达式求值为真,就进入循环体,执行循环体中的语句(若循环体有多个语句,就需要用花括号把这些语句括起来)。在循环体结束以前,控制循环表达式的变量的值必须被改变,否则,就会陷入无限循环。
例子:awk ‘{ i=1; while (i <= NF){ print NF,$i ; i++ }}’ filename
变量i的初试值是1。若i小于或者等于NF(记录中域的个数),则执行打印语句,且i增加1。然后再测试表达式,直到i的值大于NF.直到处理信的记录i才重新初始化。
7.7.2 for循环
for循环和while循环的实质是一样的,只是for循环的括号中有三个表达式:初始化变量的表达式,测试表达式以及更新格式表达式中所使用的变量的表达式。在awk中,括号里面第一个初始化语句只能初始化一个变量(在c语言中可以通过用冒号分割进行多个初始化)。
例子:awk ‘{ for (i=1;i<=NF;i++) print NF,$i }’ filex
变量i被初始化为1,并在测试表达式中测试它是否小于或者等于NF。如果是,print函数就可以NF值并打印该记录的第I个域,然后i再增加1(for循环经常用在END模板中循环处理数组所有的元素)。
7.7.3 循环控制
break 和 continue语句。Break语句使你能在满足某个特定条件时跳出循环。在满足某个特定条件的情况下,continue可以使循环忽略任何语句,而直接返回循环的顶端,开始下一次重复。
7.8 程序控制语句
7.8.1 next语句
next语句从输入文件中读取下一行,然后从头开始执行awk脚本。
7.8.2 exit语句
exit语句用于结束awk程序。它终止对记录的处理,但是不会忽略end模块,如果exit语句被赋予一个0~255之间的参数(例如 exit 1),这个参数就被打印到命令行,以判断退出成功还是失败。
7.9 数组
因为awk中数组的下标可以是数字和字母,所以称为关联数组(associative array).数组的下标(subscript)通常称为关键字(key)并且跟相应元素的值有关系。值和关键字都存在内部的一张对问题中的关键字和值应用散列法运算法则的表格里(也就是哈希表)。
数组和变量一样,都是在使用的时候自动创建,awk可以自己判断其存储的数字是数字还是字符串。根据内容的不同,awk的数组初试值是数字0或空字符串。
7.9.1 下标与关联数组
用变量作为数组索引。变量可以作为数组下标值的索引,该变量的值可以是数组或者字符串。
Special for循环。Special for 循环在for循环一旦无法发挥作用的时候,用于循环读取关联数组中的元素。当下标是字符串或者是不连续的数字时,special for循环就把下标作为关键字。访问跟其关联的值。
用字符串作为下标。下标可以时文字或者包含字符串的变量。如果下标是文字,那么必须用双引号括起来。
用域值作为数组的下标。任何表达式都可以用做数组的下标,域当然也可以。
数组和split函数。Awk的内建函数split允许你把一个字符串分割为单词并存储在数组中。你可以自动定义域分割符或者使用现在FS(域分隔符)的值。
Delete函数。该函数用于删除数组元素。
Awk的多维数组。
7.10 awk内建函数。
7.10.1 字符串函数
sub和gsub函数。Sub函数匹配记录中最大,最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。
Index函数。Index函数返回子字符串第一次被匹配的位置,偏移量从位置1开始。
Length函数。Length函数返回没有参数的字符串的长度。Length函数返回整个记录中的字符数。
Substr函数。Substr函数返回从位置1开始的字符串的子字符串。如果子字符串的长度给定,就返回字符串的一部分。如果知道的长度超过实际长度,就返回整个字符串。
Match函数。Match函数返回在字符串中正则表达式位置的索引,如果找不到指定的正则表达式就返回0。Match函数设置内建变量RSTART维字符串中子字符串的开始位置,RELENGTH为到子字符串末尾的字符个数。
Toupper和tolower函数(仅在gawk中有效)。Toupper函数把字符串中所有的小写字母都变成大写字母,而非字母的字符则不改变。Tolower函数把字符串中所有的大写字母都变成小写,而非字母的字符则不改变。
Split函数。Split函数使用作为第三个参数的域分割符把字符串分割为一个数组。如果第三个参数没有提供,awk就默认使用当前FS值。
Sprintf函数。Sprintf函数返回指定格式的表达式,这个函数允许你使用printf函数 格式说明符。
7.10.2 时间函数
systime函数。Systime函数返回从1970年1月1日(称为元年)开始到当前时间(不计闰年)的整秒数。
Strftime函数。Strftime函数使用C库中的strftime函数格式化时间。格式说明符的格式是%T或%D等等。
7.10.3 内建数学函数。
名称 | 返回值 |
Atan2(x,y) | Y,x范围内的余切 |
Cos(x) | 余弦函数 |
Exp(x) | 求幂 |
Int(x) | 取整 |
Log(x) | 自然对数 |
Rand() | 随机数 |
Sin(x) | 正弦 |
Sqrt(x) | 平方根 |
Srand(x) | X是rand()函数的种子 |
7.10.4 整数函数
int函数通过去掉浮点数的小数点右边的部分,把浮点数变为整数,这个过程中没有舍入。
7.10.5 随机数发生器
rand函数。Rand函数用来产生一个大于等于0而小于1的随即数。
Srand函数。没有参数的srand函数用时间作为rand函数的种子。Srand(x)则用x作为种子,在程序运行过程中,x应当是不断变化的。
7.11 自定义函数
自定义函数可以放在脚本中任何可以放置模板和动作的地方
格式:
function name ( parameter, parameter, parameter, … ) {
statements
returen expression
(the return statement and expression are optional )
}
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/312079/viewspace-245428/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/312079/viewspace-245428/