1.概述 awk是一个功能十分强大的文本处理命令,本文主要介绍一些常用的文本处理方法。
2.awk命令行格式 格式1: awk ‘{[pattern] action}’ filenames
格式2: awk -F #指定分割字符
格式1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@smart Desktop]# cat test.log Apr 21 15:34:49 smart user: hello Apr 21 15:34:59 smart user: hello2 Apr 22 15:45:55 smart test1.bin: test1.c main 15 Apr 22 15:46:08 smart test1.bin: test1.c main 15 [root@smart Desktop]# awk '{print $5}' test.log user: user: test1.bin: test1.bin: [root@smart Desktop]# [root@smart Desktop]# awk '{print}' test.log Apr 21 15:34:49 smart user: hello Apr 21 15:34:59 smart user: hello2 Apr 22 15:45:55 smart test1.bin: test1.c main 15 Apr 22 15:46:08 smart test1.bin: test1.c main 15
格式2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@smart Desktop]# awk -F: '{print $1}' test.log Apr 21 15 Apr 21 15 Apr 22 15 Apr 22 15 [root@smart Desktop]# awk -F: '{print $2}' test.log 34 34 45 46 [root@smart Desktop]# awk -F: '{print $3}' test.log 49 smart user 59 smart user 55 smart test1.bin 08 smart test1.bin [root@smart Desktop]#
3.awk示例 1 2 3 4 5 [root@smart Desktop]# cat table.txt Index Name Sex Age Date Location 1 Xiaohong Man 10 1990/1/2 Shenzhen 2 Xiaoming Woman 10 1990/1/3 Shenzhen 3 Xiaogang Man 10 1990/1/4 Shenzhen
1)打印所有文件内容 1 2 3 4 5 6 7 8 9 10 11 [root@smart Desktop]# awk '{print}' table.txt Index Name Sex Age Date Location 1 Xiaohong Man 10 1990/1/2 Shenzhen 2 Xiaoming Woman 10 1990/1/3 Shenzhen 3 Xiaogang Man 10 1990/1/4 Shenzhen [root@smart Desktop]# awk '{print $0}' table.txt Index Name Sex Age Date Location 1 Xiaohong Man 10 1990/1/2 Shenzhen 2 Xiaoming Woman 10 1990/1/3 Shenzhen 3 Xiaogang Man 10 1990/1/4 Shenzhen
2)打印部分列 1 2 3 4 5 6 7 8 9 10 [root@smart Desktop]# awk '{print $1}' table.txt Index 1 2 3 [root@smart Desktop]# awk '{print $2}' table.txt Name Xiaohong Xiaoming Xiaogang
3)模式匹配 1 2 3 4 5 6 7 8 [root@smart Desktop]# awk '/user/' test.log Apr 21 15:34:49 smart user: hello Apr 21 15:34:59 smart user: hello2 [root@smart Desktop]# awk '/1\/3/' table.txt 2 Xiaoming Woman 10 1990/1/3 Shenzhen [root@smart Desktop]# awk '/1\/3/ {print $2}' table.txt Xiaoming [root@smart Desktop]#
4)精确匹配 1 2 [root@smart Desktop]# awk '$2=="Xiaoming" {print}' table.txt 2 Xiaoming Woman 10 1990/1/3 Shenzhen
5)不匹配 1 2 3 4 5 6 [root@smart Desktop]# awk '/Xiaoming/ {print}' table.txt 2 Xiaoming Woman 10 1990/1/3 Shenzhen [root@smart Desktop]# awk '!/Xiaoming/ {print}' table.txt Index Name Sex Age Date Location 1 Xiaohong Man 10 1990/1/2 Shenzhen 3 Xiaogang Man 10 1990/1/4 Shenzhen
6)条件/逻辑组合 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@smart Desktop]# awk '$1>=2 {print}' table.txt Index Name Sex Age Date Location 2 Xiaoming Woman 10 1990/1/3 Shenzhen 3 Xiaogang Man 10 1990/1/4 Shenzhen [root@smart Desktop]# awk '$1>1 && $1<3 {print}' table.txt 2 Xiaoming Woman 10 1990/1/3 Shenzhen [root@smart Desktop]# awk '$2=="Xiaoming"||$2=="Xiaohong" {print}' table.txt 1 Xiaohong Man 10 1990/1/2 Shenzhen 2 Xiaoming Woman 10 1990/1/3 Shenzhen [root@smart Desktop]# awk '/Xiaoming|Xiaohong/ {print}' table.txt 1 Xiaohong Man 10 1990/1/2 Shenzhen 2 Xiaoming Woman 10 1990/1/3 Shenzhen [root@smart Desktop]#
7)内置变量 NR:已读记录数
NF:当前记录域总数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@smart Desktop]# awk '{print NF,NR,$0}' table.txt 6 1 Index Name Sex Age Date Location 6 2 1 Xiaohong Man 10 1990/1/2 Shenzhen 6 3 2 Xiaoming Woman 10 1990/1/3 Shenzhen 6 4 3 Xiaogang Man 10 1990/1/4 Shenzhen [root@smart Desktop]# awk '{print NF,$0}' table.txt 6 Index Name Sex Age Date Location 6 1 Xiaohong Man 10 1990/1/2 Shenzhen 6 2 Xiaoming Woman 10 1990/1/3 Shenzhen 6 3 Xiaogang Man 10 1990/1/4 Shenzhen [root@smart Desktop]# awk '{print NR,$0}' table.txt 1 Index Name Sex Age Date Location 2 1 Xiaohong Man 10 1990/1/2 Shenzhen 3 2 Xiaoming Woman 10 1990/1/3 Shenzhen 4 3 Xiaogang Man 10 1990/1/4 Shenzhen
8)计算 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [root@smart Desktop]# awk '$4=$4+4 {print $0}' table.txt Index Name Sex 4 Date Location 1 Xiaohong Man 14 1990/1/2 Shenzhen 2 Xiaoming Woman 14 1990/1/3 Shenzhen 3 Xiaogang Man 14 1990/1/4 Shenzhen [root@smart Desktop]# awk '{if($4!="Age") $4=$4+4}{ print $0}' table.txt Index Name Sex Age Date Location 1 Xiaohong Man 14 1990/1/2 Shenzhen 2 Xiaoming Woman 14 1990/1/3 Shenzhen 3 Xiaogang Man 14 1990/1/4 Shenzhen [root@smart Desktop]# [root@smart Desktop]# awk '{if($4!="Age") $4=$4+4 print $0}' table.txt awk: {if($4!="Age") $4=$4+4 print $0} awk: ^ syntax error [root@smart Desktop]# awk '{if($4!="Age") $4=$4+4; print $0}' table.txt Index Name Sex Age Date Location 1 Xiaohong Man 14 1990/1/2 Shenzhen 2 Xiaoming Woman 14 1990/1/3 Shenzhen 3 Xiaogang Man 14 1990/1/4 Shenzhen [root@smart Desktop]#
9)新增输出内容 1 2 3 4 5 6 7 8 9 10 11 12 13 [root@smart Desktop]# awk 'BEGIN{print 1 2 3} {print $0}' table.txt 123 Index Name Sex Age Date Location 1 Xiaohong Man 10 1990/1/2 Shenzhen 2 Xiaoming Woman 10 1990/1/3 Shenzhen 3 Xiaogang Man 10 1990/1/4 Shenzhen [root@smart Desktop]# awk 'BEGIN{print "1 2 3"} {print $0}' table.txt 1 2 3 Index Name Sex Age Date Location 1 Xiaohong Man 10 1990/1/2 Shenzhen 2 Xiaoming Woman 10 1990/1/3 Shenzhen 3 Xiaogang Man 10 1990/1/4 Shenzhen [root@smart Desktop]#
4.注意事项 1)双引号与单引号
特别注意awk与shell脚本中,单引号与双引号互包含的区别
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [root@smart Desktop]# awk "{print}" table.txt Index Name Sex Age Date Location 1 Xiaohong Man 10 1990/1/2 Shenzhen 2 Xiaoming Woman 10 1990/1/3 Shenzhen 3 Xiaogang Man 10 1990/1/4 Shenzhen [root@smart Desktop]# awk "$2=="Xiaoming" {print}" table.txt awk: ==Xiaoming {print} awk: ^ syntax error [root@smart Desktop]# awk "$2=='Xiaoming' {print}" table.txt awk: =='Xiaoming' {print} awk: ^ syntax error [root@smart Desktop]# [root@smart Desktop]# A=1 [root@smart Desktop]# B=2 [root@smart Desktop]# echo "'$A' $B" '1' 2 [root@smart Desktop]# echo ''$A' $B' 1 $B [root@smart Desktop]# echo '"$A" $B' "$A" $B [root@smart Desktop]#