您的位置:首页 > 运维架构 > Linux

Linux命令备忘实例(16)——awk(2/2)

2015-10-15 23:29 721 查看
前一篇介绍了awk的基本命令格式,以及提供的脚本编程环境的基本内容,这里接着将awk脚本环境提供的高级内容整理于此。

1.数组

对于比较复杂的脚本处理,awk提供了一维数组这种数据结构,这大大扩展了awk脚本的功能范围。数组将索引都视为字符串,类似一般脚本语言中的关联数组。A[1]和A[“1”]是访问同一个元素。

初始时,数组为空,对于元素添加直接使用访问同样的语法,如果对于索引的元素不存在就添加了元素,否则就改变了对应的值。

A["name"]="Tom";A["age"]="12  #新添加数据
A["name"]="James"  #修改数据


元素判断:(ele in A:如果存在则返回1,否则返回0)

if (ele in A) ...


数组遍历

for (var in A)  expression...


删除元素或数组

delete A["name"]  #删除数组的一个元素
delete A          #删除整个数组


多维数组

使用内置的变量SUBSEP进行连接来创建多维数组,SUBSEP的默认值为“\034”,A[expr1, expr2]等同于A[expr1 SUBSEP expr2]。测试一个多维数组的元素是否存在使用如下方法:

if ((i,j) in A) print A[i, j]
...


2 正则表达式

对于字段或字符串的测试可以使用正则表达式,使用如下的格式进行测试:

expr ~ /regex/ {action}
expr !~ /regex/ {action}


正则表达式用一对“/”包含,运算符“~”表示匹配,“!~”表示不匹配。对于上述匹配的表达式,表示expr的一个子字符串能够通过正则表达式regex匹配,如果能匹配到则返回1,否则返回0。

对于每个匹配到的内容,使用后面的action进行处理。awk使用的是扩展的正则表达式egrep(1)。

3 输入与输出

输出函数有两个,分布是print和printf。默认情况不指定参数时print函数将$0 ORS输出到标准输出,如果使用参数,可以以逗号分隔多个参数输出。printf的使用与C语言中printf函数的使用完全相同。

输入函数为getline函数,在达到文件末尾时返回0,错误时返回-1,其他情况返回1。存在如下情况的变种:



其他输出:

函数close(expr)关闭文件或者管道expr;fflush(expr)将刷新换成输出到文件中;system(expr)可以进行系统调用,执行expr命令。

4 用户自定义函数

函数定义语法如下:

function name(args)
{
...
statements
...
}


函数调用可以进行嵌套或者递归,函数通过引用进行传递,额外的用来作为局部变量的参数初始化为null,下面的函数csplit(s, A)将字符串s的每个字符都放在A数组中并且返回字符串s的长度:

function csplit(s,A,   n,i) #额外的局部变量放在参数列表中
{
n = length(s)
for( i = 1; i <= n; i++) A[i] = substr(s, i, 1)
return n
}


函数名称与“(”必须紧邻,否则回被与连接运算混淆。

5 实例说明

1 设置字段定界符

有两种方式,第一种是通过awk的命令参数-F指定,第二种是在脚本内部使用FS变量来指定。

awk -F: '{print $1}' /etc/passwd
awk 'BEGIN{ FS=":" } {print $1}' /etc/passwd


2 过滤要处理的行

awk 'NR < 5' #处理行号小于5的行,行号从1开始计数
awk 'NR==1,NR==3' #行号在1到3的行,包含1和3
awk '/regex/' #包含regex匹配到的行


3 getline实例

读取命令的输出:

user@ubuntu$~ awk '{ "grep root /etc/passwd" | getline cmdout; print cmdout}'
root:x:0:0:root:/root:/bin/bash


读取文件的某一行,在BEGIN中读取第一行:

user@ubuntu$~ seq 5 | awk 'BEGINP{getline; print "Read first line: ", $0 }{ print $0}'
Read first line: 1
2
3
4
5


对awk这个强大的处理工具还需要在实际使用的过程中多多发掘,虽然简单的处理可以使用其他简单命令来完成,但是从简单到复杂的文本处理都可以使用awk工具来完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: