一、内置变量
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