一. awk命令格式与参数

1.1 标准格式

awk [选项] ‘模式{动作}’ [文件信息]

1.2 普通模式

1.2.1 正则表达式作为模式

^ 还可以表示某一列的开始 $  还可以表示某一列的结尾

1.3 特殊模式

1.3.1 BEGIN{}

括号里面内容会在awk读取文件之前执行

  1. awk 'BEGIN{print "oldboy"}{print $0}' reg.txt

1.3.2 END{}

括号里面内容会在awk读取文件之后执行

  1. awk '{print $0}END{print "end of file"}' reg.txt

1.4 内置变量

  1. NF 表示最后一列信息
  2. NR 表示行号信息 NR==3
  3. $1 第一列
  4. $2 第二列
  5. $0 整行

二. 参数说明

  1. , 表示空格
  2. " " 表示空格
  3. ~ 表示按列进行匹配
  4. !~ 表示按列进行排除匹配
  5. -F " " 用于指定awk切割列的条件信息 (默认以空格分隔) -F: 利用-F [ ]+ 可以将连续多个切割字符整合为一个整体
  6. awk '{gsub(/ /," ",$n);print $n}' / / 要替换修改的信息 " " 修改成什么信息 $n 需要修改的列的信息
  7. awk -v 参数可以设置变量
  8. awk 调取变量不需要加上$

三. awk查找

  1. reg.txt文件内容:
  2. Zhang Dandan 41117397 :250:100:175
  3. Zhang Xiaoyu 390320151 :155:90:201
  4. Meng Feixue 80042789 :250:60:50
  5. Wu Waiwai 70271111 :250:80:75
  6. Liu Bingbing 41117483 :250:100:175
  7. Wang Xiaoai 3515064655 :50:95:135
  8. Zi Gege 1986787350 :250:168:200
  9. Li Youjiu 918391635 :175:75:300
  10. Lao Nanhai 918391635 :250:100:175

3.1 按行号匹配

  1. awk 'NR==1' reg.txt
  2. Zhang Xiaoyu 390320151 :155:90:201

3.2 显示指定行的指定列的信息

  1. awk 'NR==2{print $1" "$3}' ~/reg.txt
  2. Zhang 390320151
  3. " "空格

3.3 按列进行匹配

  1. awk '$2~/Xiaoyu/' ~/reg.txt
  2. Zhang Xiaoyu 390320151 :155:90:201

3.4 显示指定行的指定列的信息

  1. awk '$2~/Xiaoyu/{print $1" "$3}' ~/reg.txt
  2. Zhang 390320151

3.5 按列进行排除匹配

  1. awk '$2!~/Xiaoyu/' ~/reg.txt
  2. Zhang Dandan 41117397 :250:100:175
  3. Meng Feixue 80042789 :250:60:50
  4. Wu Waiwai 70271111 :250:80:75
  5. Liu Bingbing 41117483 :250:100:175
  6. Wang Xiaoai 3515064655 :50:95:135
  7. Zi Gege 1986787350 :250:168:200
  8. Li Youjiu 918391635 :175:75:300
  9. Lao Nanhai 918391635 :250:100:175
  10. awk '/250/' reg.txt

3.6 取出列中的部分内容(以一个或多个空格和 : 作为分割)

  1. awk -F "[ :]+" '$1~/Zhang/{print $2,$5}' reg.txt
  2. awk -F "[ :]+" '/^Zhang/{print $2,$(NF-1)}' reg.txt
  3. Zhang 390320151

3.7 实例

3.7.1 显示所有以41开头的ID号码的人的全名和ID号码

  1. awk '$3~/^41/{print $1,$2,$3}' reg.txt

3.7.2 显示所有ID号码最后一位数字是1或5的人的全名

  1. awk '$3~/[15]$/{print $1 $2}' reg.txt
  2. awk '$3~/(1|5)$/{print $1 $2}' reg.txt

3.8 计算

  1. [root@115 scripts]# echo "3 9"|awk '{print ($1+3)*$2}'
  2. 54

四. awk替换

4.1 显示Xiaoyu的捐款,每个都以$开头, 如$110$220$330

  1. awk '$2~/Xiaoyu/{gsub(/:/,"$",$4);print $4}' reg.txt
  2. $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. 1awk '/nologin$/{i++}END{print i}' /etc/passwd
  2. 18
  3. 2awk '/^$/{i=i+1}END{print i}' /etc/services
  4. 17
  5. 3awk -vi=1 'BEGIN{i=i+1;print i}'
  6. 2
  7. 4seq 10|awk '{i=i+$1}END{print i}'
  8. 55
  9. 5seq 10|awk '{i+=$1}END{print i}'
  10. 55
  11. 6awk 'BEGIN{array[10]="linux";print array[10]}' (双引号)
  12. linux