目录
1.gawk 内建变量初识
#使用FS 分割字符,OSF替换为的输出分割符合
$ gawk 'BEGIN{FS=":";OFS=" H: "} {print $1,$6}' /etc/passwd
#$1 $6 分别代表分割的数据位置
#效果
:<<!
houseUser H: /usr/local/mysql
mysql H: /var/lib/mysql
nginx H: /var/lib/nginx
rabbitmq H: /var/lib/rabbitmq
testShared H: /home/testShared
!
#data2 文本内容,以“\n” 作为分割字符,“ ”空格作为行分割,
:<<!
Riley Mullen
123 Main Street
Chicago, IL 60601
(312)555-1234
Frank Williams
456 Oak Street
Indanapolis,IN 46201
(317)555-9876
Haley Snell
4231 Elm Street
Detroit. MI 48201
(313)555-4938
!
$gawk 'BEGIN{FS="\n";RS=""} {print $1,$4}' data2
#效果如下
Riley Mullen (312)555-1234
Frank Williams (317)555-9876
Haley Snell (313)555-4938
#gawk 其他内建变量,ARGC 变量个数,ARGV命令行文本参数值
$ gawk 'BEGIN{print ARGC,ARGV[1]}' data1
2 data1
$ gawk 'BEGIN{print ARGC,ARGV[0]}' data1
2 gawk
$ gawk 'BEGIN{print ENVIRON["HOME"]}'
/home/website
$ gawk 'BEGIN{print ENVIRON["PATH"]}'
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/website/.local/bin:/home/website/bin
#当分割字符之后,不知道有多少个数据段,$NF 数据段总数,$FNR 所有处理数据行总数
$ gawk 'BEGIN{FS=":";OFS=":"} {print $1,$NF}' /etc/passwd
root:/bin/bash
bin:/sbin/nologin
#test.sh 脚本内容
BEGIN{print "the starting value is",n;FS="."}
{print $n}
#data1 内容
data1.data12.data11.
data13.data15.data12.
data14.data16.data13.
#-v n=3 提前设置变量值,在print 命令执行前
$ gawk -v n=3 -f test.sh data1
the starting value is 3
data11
data12
data13
2.gawk 分割字段匹配
#!/bin/bash
$ gawk -F: '$4 == 0{print $1}' /etc/passwd
root
sync
shutdown
halt
operator
#打印系统用户组为0的用户名称
#此命令先分割/etc/passwd 所有字段
#第一个字段$1 跟一个正则表达式/website/ 然后打印$6 目录变量内容
$gawk -F: '$1 ~ /website/{print $6}' /etc/passwd
3.gawk 条件语句判断
#!/bin/bash
$gawk '{if($1 > 20) print $1}' data4
#变量值判断 if then fi 语句
$ cat test.sh
#!/bin/bash
# test shell script
gawk '{
if ($1 > 20)
{
x = $1 * 2
print x
}
}' $1
#test.sh 脚步内容 执行命令 ./test.sh data4
data4 内容如下
20
10
30
32
#gawk 循环条件之下
$ cat test.sh
#!/bin/bash
# test shell script
gawk '{
total=0
i=1
while (i < 4)
{
total += $i
++i
}
avg=total / 3
print "Average:",avg
}' $1
# 内容是每行3个数据段,空格默认分隔符
$ cat data5
130 120 135
160 113 140
145 170 215
#最后执行结果如下
$ ./test.sh data5
Average: 128.333
Average: 137.667
Average: 176.667
#脚本使用for 循环来操作,print 打印变量以,区分
$ cat test.sh
#!/bin/bash
# test shell script
gawk '{
total=0
for (i =1 ; i < 4; ++i)
{
total += $i
}
avg=total / 3
print "Average:",avg
}' $1
4.gawk 格式化输出
#%-16s 字符串s默认是右对齐,-表示左对齐16字符 格式化字符串用关键字 printf 来操作
#FS 字段分割符 换行,RS 为行分割空格
$ gawk 'BEGIN{FS="\n";RS=""} {printf "%-16s %s\n",$1,$4}' data2
Riley Mullen (312)555-1234
Frank Williams (317)555-9876
Haley Snell (313)555-4938
# 数据文件data2内容
$ cat data2
Riley Mullen
123 Main Street
Chicago, IL 60601
(312)555-1234
Frank Williams
456 Oak Street
Indanapolis,IN 46201
(317)555-9876
Haley Snell
4231 Elm Street
Detroit. MI 48201
(313)555-4938
#gawk 自定义函数
$ cat test.sh
#!/bin/bash
# test shell script
gawk '
function myprint(){
printf "%-16s - %s\n",$1,$4
}
BEGIN{FS="\n";RS=""}
{
myprint()
}
' $1
#脚步内容如上 调用 ./test.sh data2