gawk 高级

gawk的高级用法
(1)变量
a. gawk字段分隔符与记录分隔符。
FIELDWIDTHS  以空格分割的数字列表,用空格定义每个数据字段的精确宽度
FS            输入字段分割符
RS            输入记录分割符
OFS           输出字段分割符
ORS           输出记录分割符
[root@localhost chapter19]# cat data1
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35
[root@localhost chapter19]# gawk 'BEGIN {FS=",";OFS="-"} { print $1,$2,$3}' data1
data11-data12-data13
data21-data22-data23
data31-data32-data33
FS指定输入字段分割符,而OFS指定输出字段分割符。
RS记录输入分割符。
[root@localhost chapter19]# cat <data2
Riley Mullen
123 Main Street
Chicago,1L 60601
(312)555-1234
Frank Williams
456 Oak Street
Indianapolis, IN 46201
(317)555-9876
Haley Snell
4231 ELM street
Detroit,MI 48201
(313)555-4938
[root@localhost chapter19]# gawk 'BEGIN{FS="/n";RS=""}{printf "%s%s/n",$1,$4}' data2
Riley Mullen(312)555-1234
Frank Williams(317)555-9876
Haley Snell(313)555-4938
b.关联数组
关联数组使用文本而不是使用数值作为数组的索引。
[root@localhost chapter19]# gawk 'BEGIN{print ENVIRON["PATH"];print ENVIRON["HOME"]}'
/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/opt/real/RealPlayer:/root/bin:/opt/real/RealPlayer:/opt/real/RealPlayer:/opt/real/RealPlayer:/opt/real/RealPlayer
/root
ENVIRON变量使用关联数组来检查shell变量 。
[root@localhost chapter19]# gawk 'BEGIN{FS=":";OFS=":"}{print $1,$NF}' /etc/passwd
root:/bin/bash
bin:/sbin/nologin
daemon:/sbin/nologin
adm:/sbin/nologin
lp:/sbin/nologin
sync:/bin/sync
shutdown:/sbin/shutdown
halt:/sbin/halt
mail:/sbin/nologin
FS输入字段分割符为:,输出字段分割符也为:
NF表示最后一个字段的数组,那么$NF就表示最后一个字段的值。
c.用户自定义变量
[root@localhost chapter19]# gawk 'BEGIN{testing="this is a test";print testing;}'
this is a test
定义一个testing变量,然后print输出。
[root@localhost chapter19]# cat <script1
BEGIN{FS=","}
{print $n}
[root@localhost chapter19]# gawk -f script1 n=2 data1
data12
data22
data32
-f执行脚本。设置变量n的值。但有一个问题,在命令行中设置的n的值在代码的BEGIN部分不能使用。可以通过-v来解决。
[root@localhost chapter19]# cat <script2
BEGIN{ print "the starting value is",n;FS=","}
{ print $n }
[root@localhost chapter19]# gawk -f script2 n=3 data1
the starting value is
data13
data23
data33
[root@localhost chapter19]# gawk -f script2 -v  n=3 data1
the starting value is 3
data13
data23
data33
这样在BEGIN部分就能使用了。
(2)数组
定义数组变量:
var[index]=element
#!/bin/bash
gawk '
BEGIN{
 var[0]=1
 var[2]=3
 total=var[0]+var[2]
 print total
}'
(3)使用模式
匹配操作符: ~
#!/bin/bash
gawk '
BEGIN{
FS=":"
}
{
if ($1 ~/root/)
print $1,$NF
}' /etc/passwd
$1 ~/root/ 表示第一个字段匹配root.
(4)结构化命令
if语句:
[root@localhost chapter19]# cat <data4
10
5
13
50
34
#!/bin/bash
gawk '{
if($1>20){
x=$1*2
print x
}
}' data4
while语句:
[root@localhost chapter19]# cat <data5
100 110 120
130 140 150
160 170 180
#!/bin/bash
gawk '{
total=0
i=1
while(i<4){
total+=$i
i++
}
avg=total/3
print "Average:",avg
}' data5
结果:
[root@localhost chapter19]# ./script8
Average: 110
Average: 140
Average: 170
当while计算出第一个记录的值时,会去读下一条记录,然后去计算,记录是以换行符为分隔符的。
(5)格式化打印
printf "format string",var1,var2.....
#!/bin/bash
gawk '
BEGIN{
FS="/n"
RS=""
}
{
printf "%s-%s/n",$1,$4
}' data2
结果是:
[root@localhost chapter19]# ./script10
Riley Mullen-(312)555-1234
Frank Williams-(317)555-9876
Haley Snell-(313)555-4938

你可能感兴趣的:(gawk,高级)