shell编程——文本处理利器awk命令(三)

awk作为一种程序设计语言,支持程序的流程控制。

1    if语句

if    (expression)

{

    statement1

    statement2

}

else

{

    statement1

    statement2

}

if else 语句还可以嵌套

2    while语句

while (expression)

{

    statement1

    statement2

    ...

}


do {

    statement1

    statement2

    ...

} while (expression)

3    for语句

for (expression1; expression2; expression3)

{

    statement1

    statement2

    ...

}

eg.

for(i=1;i<9;i++){

...

}

4    break语句

退出循环

5    continue

退出本次循环

6    getline

读取数据文件,awk中用于输入重定向的一个函数,它可以从标准输入、管道或者文件读取输入数据,而不只是从当前被处理的文件来读取。getline读取一条数据之后会自动更新NF NR以及FNR等系统变量。

如果成功读取一条记录,则getline返回1;如果到了文件末尾,则返回0。

7    next语句

next语句的功能与continue非常相似,但是next语句并不是用在循环结构中,而是用在整个awk程序。

当awk程序执行时,如果遇到next语句,则该语句后面的所有的程序都被忽略,包括其他的模式以及对应的操作。awk会继续读取下一行数据,并且从第一个模式及其操作开始执行。

8    exit语句

终止awk程序的执行

9    基本print语句

print string1,string2,....

各个参数之间使用逗号隔开。在输出时,print语句会自动使用空格将各个参数自隔开。

10    格式化printf语句

printf(format, [arguments])

第一个参数format是用来描述输出格式的字符串

%format:

c    ASCII字符

d    十进制字符

e    浮点格式

s    字符串

%    百分号本身

eg.

{

    printf ("%s\t%d\t%d\t%d\t%d\t%d\n",$1,$2,$3,$4,$5,($2 +$3+$4+%5))

}

与print不同,printf函数不会自动在输出的末尾加上一个换行符,因此用户需要早格式化字符串的最后追加一个\n字符。

11    使用sprintf()函数生成格式化字符串

sprintf()函数的功能与printf()大致相同,但是该函数只是以字符串形式返回格式化结果,并不输出到标准输出设备。

12    awk程序与shell的交互

awk提供了与shell命令交互的能力,从而可以使用户在awk程序中使用系统资源。

用户可以很容易地在awk程序中使用系统资源,包括在程序中调用shell命令处理程序中的数据,或者在shell中获取shell命令的执行结果。

使用管道实现与shell的交互:

while ("who" | getline ) n++

首先调用shell中的who命令,列出当前系统中已登录的用户,每一行描述一个用户信息,然后将who命令的执行结果通过管道传输给getline函数,该函数每次读取每一行数据。

通过system函数实现与shell的交互:

system(command)

其中command参数表示要执行的shell命令。

与管道相比,system有很多局限性,例如不能在awk程序中直接获取shell命令的执行结果,另外也不能直接将awk程序中的数据传递给shell命令来处理。

BEGIN {

    system ("ls > filelist")

    while(getline < "filelist" > 0)

    {

        print $1

    }

}

由于system不支持数据的传递,所以需要借助一个临时文件作为数据传递的桥梁。

你可能感兴趣的:(shell编程——文本处理利器awk命令(三))