一. awk命令格式与参数
1.1 标准格式
awk [选项] ‘模式{动作}’ [文件信息]
1.2 普通模式
1.2.1 正则表达式作为模式
^ 还可以表示某一列的开始 $ 还可以表示某一列的结尾
1.3 特殊模式
1.3.1 BEGIN{}
括号里面内容会在awk读取文件之前执行
awk 'BEGIN{print "oldboy"}{print $0}' reg.txt
1.3.2 END{}
括号里面内容会在awk读取文件之后执行
awk '{print $0}END{print "end of file"}' reg.txt
1.4 内置变量
NF 表示最后一列信息
NR 表示行号信息 NR==3
$1 第一列
$2 第二列
$0 整行
二. 参数说明
, 表示空格
" " 表示空格
~ 表示按列进行匹配
!~ 表示按列进行排除匹配
-F " " 用于指定awk切割列的条件信息 (默认以空格分隔) -F: 利用-F [ ]+ 可以将连续多个切割字符整合为一个整体
awk '{gsub(/ /," ",$n);print $n}' / / 要替换修改的信息 " " 修改成什么信息 $n 需要修改的列的信息
awk -v 参数可以设置变量
awk 调取变量不需要加上$
三. awk查找
reg.txt文件内容:
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
3.1 按行号匹配
awk 'NR==1' reg.txt
Zhang Xiaoyu 390320151 :155:90:201
3.2 显示指定行的指定列的信息
awk 'NR==2{print $1" "$3}' ~/reg.txt
Zhang 390320151
" "空格
3.3 按列进行匹配
awk '$2~/Xiaoyu/' ~/reg.txt
Zhang Xiaoyu 390320151 :155:90:201
3.4 显示指定行的指定列的信息
awk '$2~/Xiaoyu/{print $1" "$3}' ~/reg.txt
Zhang 390320151
3.5 按列进行排除匹配
awk '$2!~/Xiaoyu/' ~/reg.txt
Zhang Dandan 41117397 :250:100:175
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
awk '/250/' reg.txt
3.6 取出列中的部分内容(以一个或多个空格和 : 作为分割)
awk -F "[ :]+" '$1~/Zhang/{print $2,$5}' reg.txt
awk -F "[ :]+" '/^Zhang/{print $2,$(NF-1)}' reg.txt
Zhang 390320151
3.7 实例
3.7.1 显示所有以41开头的ID号码的人的全名和ID号码
awk '$3~/^41/{print $1,$2,$3}' reg.txt
3.7.2 显示所有ID号码最后一位数字是1或5的人的全名
awk '$3~/[15]$/{print $1 $2}' reg.txt
awk '$3~/(1|5)$/{print $1 $2}' reg.txt
3.8 计算
[root@115 scripts]# echo "3 9"|awk '{print ($1+3)*$2}'
54
四. awk替换
4.1 显示Xiaoyu的捐款,每个都以$开头, 如$110$220$330
awk '$2~/Xiaoyu/{gsub(/:/,"$",$4);print $4}' reg.txt
$155$90$201
五. awk特殊模式
5.1 BEGIN{ }
1) 先执行相应操作动作再操作文件
实际应用: 输出每列的表头信息
awk ‘BEGIN{print “姓”,”名”,”id”,”捐款记录”}{print $0}’ reg.txt
姓 名 id 捐款记录
Zhang Dandan 41117397 :250:100:175
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
2) 可以进行运算
awk ‘BEGIN{print 3+2}’
5
awk ‘BEGIN{print 3-2}’
1
awk ‘BEGIN{print 3*2}’
6
5.2 END{ }
1) 再操作文件之后执行相应操作动作
实际应用: 用于输出最终结果信息(前面有循环)
awk ‘print $0}END{print “hello world”}’ reg.txt
Zhang Dandan 41117397 :250:100:175
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
hello world
六. awk对文件分析处理练习
1、awk '/nologin$/{i++}END{print i}' /etc/passwd
18
2、awk '/^$/{i=i+1}END{print i}' /etc/services
17
3、awk -vi=1 'BEGIN{i=i+1;print i}'
2
4、seq 10|awk '{i=i+$1}END{print i}'
55
5、seq 10|awk '{i+=$1}END{print i}'
55
6、awk 'BEGIN{array[10]="linux";print array[10]}' (双引号)
linux