awk是一种优良的流氏文本处理工具,在使用单行命令的时候十分方便,在进行简单文本操作的时候无需在使用perl或python编写脚本,当然perl的单行命令也足够强大,只是使用习惯不同而已;相比于grep和sed来说awk可以更好对某一分割的区域进行筛选及操作。


  • F 用于识别分隔符
1
2
3
4
5
6
7
8
9
10
#打印含有数字1的行
bogon:Desktop lilibei$ cat 3.txt
bogon:Desktop lilibei$ cat 3.txt
1 2 3 4
A B C D
a b c d
a 1 2 b
bogon:Desktop lilibei$ awk -F '\t' '/1/' 3.txt
1 2 3 4
a 1 2 b
  • $0代表整行,$1代表第1列,$2代表第二列,$3完后以此类推
1
2
3
4
5
6
7
8
9
10
11
#打印指定列
bogon:Desktop lilibei$ awk -F '\t' '{print $1"\t"$2}' 3.txt
1 2
A B
a b
a 1
bogon:Desktop lilibei$ awk -F '\t' '{print $1"M####M"$2}' 3.txt
1M####M2
AM####MB
aM####Mb
aM####M1
  • OFS 指定打印的分隔符
1
2
3
4
5
6
#作用等同于上个例子
bogon:Desktop lilibei$ awk -F '\t' 'OFS="#"{print $1,$2}' 3.txt
1#2
A#B
a#b
a#1
  • awk的正则匹配不支持{}

  • 按照段落匹配,精准匹配,精准打印

1
2
3
4
5
6
7
8
9
#匹配第一列含有a的行,且只打印第四列
bogon:Desktop lilibei$ cat 3.txt
1 2 3 4
Aa B C D
aa b c d
aaaaa 1 2 b
bogon:Desktop lilibei$ awk -F '\t' '$1~/a/ {print $4}' 3.txt
d
b
  • 多个条件进行匹配
1
2
3
4
5
6
7
bogon:Desktop lilibei$ cat 3.txt 
1 2 3 4
A B C D
a b c d
a 1 2 b
bogon:Desktop lilibei$ awk -F '\t' '$1~/a/&&$3==2{print $0}' 3.txt
a 1 2 b
  • 条件判断
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bogon:Desktop lilibei$ cat 3.txt 
1 2 3 4
A B C D
a b c d
a 1 2 b
bogon:Desktop lilibei$ awk -F '\t' '$2>0&&$3<3' 3.txt
a 1 2 b
#段落大小比较
bogon:Desktop lilibei$ cat 3.txt
1 2 3 4
A B C D
a b c d
a 1 2 b
bogon:Desktop lilibei$ awk -F '\t' '$2<$3' 3.txt
1 2 3 4
A B C D
a b c d
a 1 2 b
  • if判断
1
2
3
4
5
6
7
8
9
10
11
12
bogon:Desktop lilibei$ cat 3.txt 
1 2 3 4
1 2 3 4
1 1 1 1
bogon:Desktop lilibei$ awk -F '\t' 'OFS="\t" {if($2==1) print $4}' 3.txt
1
bogon:Desktop lilibei$ cat 3.txt
1 2 3 4
1 2 3 4
1 1 1 1
bogon:Desktop lilibei$ awk -F '\t' 'OFS="\t" {if($2==1) print $4,$1}' 3.txt
1 1
  • NR 行数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#打印第3行
bogon:Desktop lilibei$ cat 3.txt
1 2 3 4
1 2 3 4
1 1 1 1
bogon:Desktop lilibei$ awk -F '\t' 'NR==3' 3.txt
1 1 1 1
#打印指定列
bogon:Desktop lilibei$ cat 3.txt
1 2 3 4
1 2 3 4
1 1 1 1
bogon:Desktop lilibei$ awk -F '\t' 'NR==3 {print $1,$2}' 3.txt
1 1
bogon:Desktop lilibei$ cat 3.txt
1 2 3 4
1 2 3 4
1 1 1 1
bogon:Desktop lilibei$ awk -F '\t' '{print NR}' 3.txt
1
2
3
  • NF 每一行列的个数
1
2
3
4
5
6
7
8
bogon:Desktop lilibei$ cat 3.txt 
1 2 3 4
1 2 3 4
1 1 1 1
bogon:Desktop lilibei$ awk -F '\t' '{print NR,NF}' 3.txt
1 4
2 4
3 4
  • 构造新的列
1
2
3
4
5
6
7
8
9
10
11
12
bogon:Desktop lilibei$ cat 3.txt 
1 2 3 4
1 2 3 4
1 1 1 1
bogon:Desktop lilibei$ awk -F '\t' 'OFS=":"{$5=$3+$4;print $0}' 3.txt
1:2:3:4:7
1:2:3:4:7
1:1:1:1:2
bogon:Desktop lilibei$ awk -F '\t' 'OFS=":"{$5=$3+$4;print $1,$5}' 3.txt
1:7
1:7
1:2
  • 循环计数
1
2
3
4
5
6
bogon:Desktop lilibei$ cat 3.txt 
1 2 3 4
1 2 3 4
1 1 1 1
bogon:Desktop lilibei$ awk -F '\t' '{(sum=sum+$1);(sum=sum+$2)};END {print sum}' 3.txt
8