一、內置變量
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