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











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