Day19操作系统三剑客命令-awk
01.三剑客awk命令概念介绍、*
概念说明:` pattern scanning and processing language
模式识别和脚本编写`
执行原理:`按行处理文件信息, 根据匹配条件信息, 完成相应操作动作`
语法结构: `awk [参数] '模式信息(条件) {动作}' 文件信息`
02.三剑客awk命令使用方法
`cat >> awk_test.txt <<EOF
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
EOF`
**练习题**
1):显示xiaoyu的姓氏和ID号码
`[root@localhost ~]# awk 'NR==2 {print $1,$3}' awk_test.txt
Zhang 390320151`
2):显示姓氏是张的的人,显示他的第二次捐款的金额
`[root@localhost ~]# awk '/^Zhang/ {print $1,$2,$4}' awk_test.txt | awk -F ':' '{print $1,$3}
Zhang Dandan 100
Zhang Xiaoyu 90`
3)显示所有以41开头的ID号码的人的全名和ID号码
`[root@localhost ~]# awk '/41/{print $1,$2,$3}' awk_test.txt
Zhang Dandan 41117397
Liu Bingbing 41117483`
4)显示所有ID号码后面是1和5的人的全名
`[root@localhost ~]# awk '$3~/[15]$/{print$1,$2}' awk_test.txt
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai`
5)显示所有ID号码后面不是1和5的人的全名
`[root@localhost ~]# awk '$3~/[^15]$/{print $1,$2,$3}' awk_test.txt |column -t
Zhang Dandan 41117397
Meng Feixue 80042789
Liu Bingbing 41117483
Zi Gege 1986787350`
6)显示Xiaoyu的捐款,每个时都有以$开头, 如$110$220$330
`[root@localhost ~]# awk '/Xiaoyu/{print $4}' awk_test.txt |sed 's#:#$#g'
$155$90$201`
print:输出指定的信息
gusb : 替换指定的信息 gawk substitute -- gsub
gsub(// , "" ,",)
说明:NF表示列信息,3
4 - 1
oldboy linux edu 50
NF)
4
NF==50 $NF-1==50-1=49
总结:
awk用到参数: -F 指定列分隔符号
awk用到的动作: print 指定输出的信息
gsub 替换指定的信息
awk内置的变量: NR 表示行号的信息
NF 表示列号的信息
print:输出指定的信息
gusb : 替换指定的信息 gawk substitute -- gsub
gsub(// , "" , $x) --> gsub (/要替换的信息)
gusb(/:/ ,"$",)
说明:NF表示列信息,$NF表示最后一列, ?倒数第二列 == $3
$NF == $4 - 1
oldboy linux edu 50
$(NF-1) ($NF)
$(4-1) $4 $4==$NF==50 $NF-1==50-1=49
总结:
awk用到参数: -F 指定列分隔符号
awk用到的动作: print 指定输出的信息
gsub 替换指定的信息
awk内置的变量: NR 表示行号的信息
NF 表示列号的信息
特殊模式
BEGIN: 在文件处理之前完成相应操作
[root@linux67 oldboy]# awk 'BEGIN{print "姓","名","ID","捐款记录"}{print0}' awk_test.txt |column -t
姓 名 ID 捐款记录
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
作用:
1) 可以实现数值运算 --- 计算器
[root@linux67 oldboy]# awk 'BEGIN{print 2+3}'
5
[root@linux67 oldboy]# awk 'BEGIN{print 2-3}'
-1
[root@linux67 oldboy]# awk 'BEGIN{print 2*3}'
6
[root@linux67 oldboy]# awk 'BEGIN{print 2^3}'
8
[root@linux67 oldboy]# awk 'BEGIN{print 2/3}'
0.666667
2) 可以实现变量设置
[root@linux67 oldboy]# awk 'BEGIN{name="oldgirl"}$2~/Xiaoyu/{print name,$1,$2}' awk_test.txt
oldgirl Zhang Xiaoyu
[root@linux67 oldboy]# awk 'BEGIN{name="oldgirl"}$2~/Xiaoyu/{print "name",$1,$2}' awk_test.txt
name Zhang Xiaoyu
[root@linux67 oldboy]# awk -F "[ :]+" '$1~/Zhang/{print $1,$2,$5}' awk_test.txt
Zhang Dandan 100
Zhang Xiaoyu 90
[root@linux67 oldboy]# awk 'BEGIN{FS="[ :]+"}$1~/Zhang/{print $1,$2,$5}' awk_test.txt
Zhang Dandan 100
Zhang Xiaoyu 90
[root@linux67 oldboy]# awk -vFS="[ :]+" '$1~/Zhang/{print $1,$2,$5}' awk_test.txt
Zhang Dandan 100
Zhang Xiaoyu 90
内置变量:
NR : 表示行的信息
NF : 表示列的信息
FS : 表示指定分隔符号
`3) 可以实现信息统计
如何进行累加运算 --> i=i+1 初始i=0 经过一次运算 i=1 经过运算 i=2