shell 之 gawk (二) 高级篇

一、内置变量

1、字段和记录分隔符变量

FIELDWIDTHS   以空格分隔的数字列表,用空格定义每个数据字段的精确宽度

FS  输入字段的分隔符    (默认空格)

RS 输入记录的分隔符   (默认换行符)

OFS 输出字段的分隔符

ORS 输出记录的分隔符

2、数据变量

ARGC

ARGIND

ARGV

CONVFMT

ENVIRON

ERRNO

FILENAME

FNR

IGNORECASE

NF

NR

OFMT

RLENGTH

RSTART


例如:

 gawk 'BEGIN {print ARGC, ARGV[1]}' data


 gawk 'BEGIN { print ENVIRON["HOME"]}'


 gawk 'BEGIN { FS=":"; OFS=":"} {print $1, $NF}' /etc/passwd



FNR与NR的区别:

gawk 'BEGIN {FS=","} {print $1, "FNR="FNR}' data1 data1

FNR变量值在gawk处理第二个数据文件时被重置,但NR会继续增加



二、用户定义的变量


1、在脚本中赋值变量

$ gawk ' BEGIN { testing="this is a test"; pring testing; testing=40; print testing}'


2、在命令行中赋值

$ cat script

BEGIN { FS=","} {print $n}

$ gawk -f script n=2 data

在BEGIN中使用变量需要使用 -v

$ gawk -v n=3 -f script2 data


三、使用数组  (关联数组)


1、定义数组变量              var[index] = element

$ gawk 'BEGIN { cap["xia"]="tian"; print cap["xia"]}'

$ gawk 'BEGIN { var[1]=2; var[2]=3; total= var[1] + var[2]; print total}'


2、在数组变量中递归

for( var in array)

{

statements

}

每次都向var分配array关联数组中的下一个索引值;  索引值不是以一定的顺序返回的

3、删除数组变量

delete  array[index]


四、使用模式


1、正则表达式

正则表达式必须出现在程序脚本的左括号前面;

$ gawk 'BEGIN { FS=","} /11/ {print $1}' data


2、匹配操作符 (波浪号~)

$1 ~ /^data/ 


如: $   gawk 'BEGIN { FS=","} $2 ~ /^data2/{print $0}'  data1

将data1 文件中的 第二个数据字段与正则表达式进行比较,匹配的那行 打印出


如: $ gawk  -F: '$1 ~ /rich/ { print $1, $NF}'  /etc/passwd

rich    /bin/bash


3、数学表达式     ==   <   <=    >   >=

   $ gawk -F: '$4 == 0{ print $1}' /etc/passwd    (显示所有属于根用户组的系统用户)



五、结构化命令


1、 if 语句

if (conditin)

statement1


2、while语句


while (condition)

{

statements

}

(支持break   ,  continue)

3、do-while语句

do

{

statements

}while(condition)

4、for语句

与C语言一样

5、格式化打印

printf  "format  string",  var1,  var2 .....  (与C类似)

如:

$  gawk 'BEGIN{

>  x = 10 * 100

>  printf "the answer is :  %e\n", x

>}'

the  answer is 1.000000e+03


六、内置的函数


七、用户定义的函数


1、定义函数

function  name( [variables])

{

statements

}

可以使用return语句

function myrand(limit)

{
return int(limit * rand())

}


2、使用自己的函数

定义函数时,必须单独出现在定义的任何代码部分(包括BEGIN)

$ gawk '

> function myprint()

>{

> printf "%-16s  -  %s\n", $1, $4

> }

>BEGIN{ FS="\n"; RS=""}

>{

> myprint()

>}' data2



3、创建函数库


首先,创建函数库文件

$ cat funclib

function myprint()

{

.........

}

function myrand()

{

..........

}

不能将-f 与内嵌的gawk脚本结合使用,因此:

 要使用库,只需要创建包含gawk程序的文件,然后在命令行上指定库文件和程序文件

$ cat script4

BEGIN{ FS="\n"; RS=""}

{

myprint()

}

使用:

 $ gawk -f funclib -f script4 data2











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章