awk命令

Catalogue
  1. 1. 使用awk命令获取文本的某一行,某一列
  2. 2. awk分隔符
  3. 3. 输出分隔符
  4. 4. NF的意思
  5. 5. 查找
  6. 6. 打印某列以后的所有列
  7. 7. awk输入输出分隔符
  8. 8. 区分shell函数的参数
  9. 9. 去掉重复行
  10. 10. 提取文本最后一行
  11. 11. 提取两个括号之间的内容
  12. 12. awk的输出格式控制:print 和printf
  13. 13. 计算2个数值的百分比
  14. 14. 在shell中统计某字符串的个数

使用awk命令获取文本的某一行,某一列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
打印文件的第一列
awk '{print $1}' filename

打印文件的前两列
awk '{print $1,$2}' filename

打印完第一列,然后打印第二列
awk '{print $1 $2}' filename

打印文本文件的总行数
awk 'END{print NR}' filename

打印文本第一行
awk 'NR==1{print}' filename

打印文本第二行第一列
sed -n "2, 1p" filename | awk 'print $1'

awk分隔符

1
2
3
4
5
6
7
8
9
10
$ cat test
a#b#c#d

$ awk -F# '{print $1,$2}' test
a b

$ awk -v FS'#' '{print $1,$2}' test
a b
awk内置变量FS可以用于指定输入分隔符,但是在使用变量时,需要使用-v选项,用于指定对应的变量,比如 -v FS=’#

输出分隔符

awk输出每一列的时候,会使用空格隔开每一列,其实,这个空格,就是awk的默认的输出分隔符
可以使用awk的内置变量OFS来设定awk的输出分隔符,当然,使用变量的时候要配合使用-v选项

1
2
3
4
5
6
7
8
9
10
11
12
awk -v FS="#" -v OFS='----' '{print $1,$2}' test
a----b
默认输出分隔符为空格
awk '{print $1,$2}' test
a b

awk '{print $1$2}' test
ab

awk '{print $1 $2}' test
ab

NF的意思

1
2
3
NF 是一个预定义的变量,其值为当前记录中的字段数。 
awk 每次读取记录时都会自动更新 NF 的值。
无论有多少个字段,记录中的最后一个字段都可以用 $NF 表示

查找

1
2
3
4
5
6
7
8
9
# cat m
a 91
b 42
c 33
d 14
e 21

# awk '/a/ {print $0}' m
a 91

打印某列以后的所有列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# cat m
a 91 sa fd
b 42 sa fd
c 33 sa fd
d 14 sa fd
e 21 sa fd

# awk '{ $1=""; print $0 }' m
91 sa fd
42 sa fd
33 sa fd
14 sa fd
21 sa fd
注:第一列会全部替换为空格

以此类推,如果我要打印某列以后的所有列的,可以使用循环把,把前N列都赋值为空
# awk '{ for(i=1; i<=3; i++){ $i="" }; print $0 }' m
fd
fd
fd
fd
fd

awk输入输出分隔符

1
2
3
4
5
6
7
8
9
10
11
awk默认从STDIN接受数据,打印文本到STDOUT。

awk的默认输入和输出分隔符:

FS : 输入字段分隔符,默认空格。

RS : 输入行分隔符,默认\n。

OFS : 输出字段分隔符,默认空格。

ORS : 输出行分隔符,默认\n。

区分shell函数的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# echo a,s,d,f |awk 'BEGIN{FS=","; OFS=""; ORS=""}{for(x=1;x<=NF;x++){print $x"\n"}}'

a
s
d
f


# for i in `echo a,s,d,f |awk 'BEGIN{FS=","; OFS=""; ORS=""}{for(x=1;x<=NF;x++){print $x"\n"}}'`;do echo $i;done

a
s
d
f

去掉重复行

1
2
3
4
5
awk '!a[$0]++' file

或者

sort file | uniq

解析

提取文本最后一行

1
2
3
awk 'END {print}'

awk '{b=a"\n"$0;a=$0}END{print b}'

提取两个括号之间的内容

1
awk 'BEGIN{FS="[()]"}{print $2}'

awk的输出格式控制:print 和printf

1
2
3
printf更加自由化,一切输出格式都需要自己定义。

print是定义好的printf,通过内部变量能改变已经定义好的格式。

printf的用法:

格式:printf “格式化”,变量1,变量2

格式化内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1.数据格式

十进制整数:%d

科学计数法显示数字:%e

浮点数:%f

字符串:%s

ASCII码:%c

2.换行,空格等

换行:\n

空格:\t

3.对齐

左对齐:“-”,默认右对齐。

计算2个数值的百分比

1
2
3
4
5
6
a=20
b=100
#计算百分比
echo `awk 'BEGIN{printf "%.1f%%\n",('$a'/'$b')*100}'`

20.0%

在shell中统计某字符串的个数

  1. 通过使用grep查找命令

    1
    $ grep -o '字符串' file | wc -l
  2. 通过使用awk命令进行统计

    1
    $ awk -v RS="@#$j" '{print gsub(/字符串/,"&")}' file
  3. 使用awk命令的另一种方式

    1
    $ awk  '{s+=gsub(/字符串/,"&")}END{print s}' file