目录
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命令的工作原理
- 执行BEGIN{commands}语句块中的有语句
- 从文件或者stdin中读取第一行
- 有无模式匹配pattern,如果没有则执行{}中的语句
- 若有则检查该整行与pattern是否匹配,若匹配,则执行{}中的语句
- 若不匹配则不执行{}中的语句,接着读取下一行
- 重复这个过程,直到所有行被读取完毕
- 执行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
实现数学和语文分数的相加