shell gawk 记录

目录

 

1.gawk 内建变量初识

2.gawk 分割字段匹配

3.gawk 条件语句判断

4.gawk 格式化输出


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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值