shell编程—awk命令详解

目录

1、awk命令完整语法和工作原理

2、awk自带变量

3、awk中的模糊匹配和精确匹配

4、awk实例

5、awk命令的引用shell变量

6、awk命令与if语句、for循环、数组组合使用


1、awk命令完整语法和工作原理

awk命令完整语法

awk 'BEGIN{commands}pattern{commands}END{commands}' filename

注意:{}里面有两条commans用;隔开


pattern可以是:
1、表示判断的 $2>3 &&(与)  || (或)
2、表示匹配的 $1 ~ /tian/  第一列中包含tian的
commands里面可以加if语句,表示if成立则执行这条语句:if($2>3) print $2,$3(,表示输出分隔符)

awk命令的工作原理

  1. 执行BEGIN{commands}语句块中的有语句
  2. 从文件或者stdin中读取第一行
  3. 有无模式匹配pattern,如果没有则执行{}中的语句
  4. 若有则检查该整行与pattern是否匹配,若匹配,则执行{}中的语句
  5. 若不匹配则不执行{}中的语句,接着读取下一行
  6. 重复这个过程,直到所有行被读取完毕
  7. 执行END{}语句块中的语句

2、awk自带变量

NR变量是记录行的,每处理一行自己加1

NF记录一行有多少列

FS当前的输入分隔符,默认为空白

OFS当前的输出分隔符,默认是空格

$1 $2 分别表示第1列、第2列

$0 表示正在处理的这一行

3、awk中的模糊匹配和精确匹配

$1 ~ /tian/ 模糊匹配,可以使用通配符
$1 == "tianyang" 精确匹配,必须一模一样

[root@sc-host fuxi]# cat test.txt 
xiaomi1 XIAOMI
huawei xiaomi
xiaomi123
xiaomi
 

#模糊匹配

[root@sc-host fuxi]# awk '$1~/\<^xiaomi.*\>/{print $0}' test.txt
xiaomi1 XIAOMI
xiaomi123
xiaomi

#精确匹配
[root@sc-host fuxi]# awk '$1=="xiaomi"{print $0}' test.txt
xiaomi

4、awk实例

[root@sc-host fuxi]# cat alijiujiu.txt 
tiankai 1
gaoshuo 1
zhangtt 10
zhoujc 1
tianyang 100
 

[root@sc-host fuxi]# awk 'BEGIN{print "阿里舅舅公司股东集资"}{sum += $2;if ($2>1)print $0}END{print "阿里 舅舅公司股东集资总额:"sum}' alijiujiu.txt 
###统计股东投资数综合(第二列),大于1的输出
[root@sc-host fuxi]# awk 'BEGIN{print "阿里舅舅公司股东集资"} $2 > 1{sum += $2;print $0}END{print "阿里舅 舅公司股东集资总额:"sum}' alijiujiu.txt 
###统计股东投资数大于1的股东投资总和
 

5、awk命令的引用shell变量

-v 引入shell变量

[root@sc-host fuxi]# name="hahha"                        #定义name变量

[root@sc-host fuxi]# echo |awk -v abc=$name '{print abc}' #引用shell变量
hahha
 

使用双引号"代替单引号',但是$符号需要转义

awk -F: "\$1 ~/$a/ {print \$1,\$3}" /etc/passwd   #\$1不是表示的第1列,而是表示第1个位置变量

6、awk命令与if语句、for循环、数组组合使用

if语句

单分支:

awk -F: '{if($1 ~ \<...\>)print $0}' /etc/passwd
如果passwd文件中的第1列包含三个或三个以上的字符,输出整行

多分支

awk -F: '{if ($3!=0) print $1;else print $3}' /etc/passwd
如果passwd文件中第3列不等于0输出第1列,等于0输出第3列

for循环

[root@sc-host fuxi]# cat grade.txt 
name chinese math english
cali 80      90   82
tom  90      80   99
lucy 99      78   75
jack 60      89   99
 

[root@sc-host fuxi]# awk 'NR>1{sum=0;for(i=1;i<=NF;i++)sum+=$i;print $1,sum}' grade.txt 
cali 252
tom 269
lucy 252
jack 248
实现每个人各科成绩的累加

数组 array

[root@sc-host fuxi]# awk 'NR>1{pro[$2]=$2;pro[$2] += $3}END{for(i in pro) print pro[i]}' grade.txt 
170
170
177
149
实现数学和语文分数的相加

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值