2019-07-25 awk总结

2019-07-25  本文已影响0人  麟之趾a

昨天回顾

今日总结

awk参数
-F 指定分隔符
-v 指定变量
动作
print 指定输出信息
gsub 指定替换
gsub(‘要替换的内容’,’替换成什么’,$第几列)
符号:
~:匹配信息,按指定列进行
!~:将指定信息取反操作
//:匹配指定的信息
awk指定模式
BEGIN{}处理文本之前执行动作
END{}处理文本之后执行动作

awk命令操作
测试环境

[root@oldboy63 ~]# cat regeix.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

01显示Xiaoyu的姓氏和ID号码

[root@oldboy63 ~]# awk '$2~/Xiaoyu/{print $1,$3}' regeix.txt (注意只显示第二个字段的Xiaoyu所以用$2匹配)
Zhang 390320151
  1. 先查找模式(即条件)Xiaoyu
[root@oldboy63 ~]# awk '$2~/Xiaoyu/' regeix.txt 
Zhang  Xiaoyu    390320151   :155:90:201
  1. 根据条件进行处理显示姓氏和ID号码
[root@oldboy63 ~]# awk '$2~/Xiaoyu/{print $1,$3}' regeix.txt 
Zhang 390320151

02.找到姓氏为Zhang的人,显示他的捐款金额及他的名字

[root@oldboy63 ~]# awk '$1~/Zhang/{print $1,$2,$4}' regeix.txt 
Zhang Dandan :250:100:175
Zhang Xiaoyu :155:90:201

03.显示所有以41开头的ID号码的人及全人民

[root@oldboy63 ~]# awk '$3~/^41/{print $1,$2}' regeix.txt 
Zhang Dandan
Liu Bingbing

04.显示所有ID号码最后一位是5或1的人的全名

[root@oldboy63 ~]# awk '$3~/1$|5$/{print $1,$2}' regeix.txt 
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai

05.获取文件中没有#号和空行的信息
环境

[root@oldboy63 ~]# cat test.txt 
hang  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
Lao    Nanhai    Xiaoyu   :250:100:175

方法一:直接使用!取反

[root@oldboy63 ~]# awk '!/#|^$/' test.txt 
hang  Dandan    41117397    :250:100:175
Meng   Feixue    80042789    :250:60:50
Wu     Waiwai    70271111    :250:80:75
Liu    Bingbing  41117483    :250:100:175
Zi     Gege      1986787350  :250:168:200
Li     Youjiu    918391635   :175:75:300
Lao    Nanhai    918391635   :250:100:175
Lao    Nanhai    Xiaoyu   :250:100:175

方法二:直接使用$1!~取反

[root@oldboy63 ~]# awk '$1!~/#|^$/' test.txt 
hang  Dandan    41117397    :250:100:175
Meng   Feixue    80042789    :250:60:50
Wu     Waiwai    70271111    :250:80:75
Liu    Bingbing  41117483    :250:100:175
Zi     Gege      1986787350  :250:168:200
Li     Youjiu    918391635   :175:75:300
Lao    Nanhai    918391635   :250:100:175
Lao    Nanhai    Xiaoyu   :250:100:175

06.显示Xiaoyu的捐款,每个捐款数都必须用$显示

方法一:awk+sed
[root@oldboy63 ~]# awk  '/Xiaoyu/{print $NF}' regeix.txt |sed 's#:#$#g'
$155$90$201
方法二:awk
[root@oldboy63 ~]# awk  -F ":" '/Xiaoyu/{print "$"$2"$"$3"$"$4}' regeix.txt 
$155$90$201
方法三:awk+gsub参数
[root@oldboy63 ~]# awk '/Xiaoyu/{gsub(/:/,"$",$NF);print($NF)}' regeix.txt 
$155$90$201
07.普通模式比较行信息

01 查找第二行以上的信息

[root@oldboy63 ~]# awk 'NR>2' regeix.txt 
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

02;取出多行信息

  1. 取出第二行和第四行信息
[root@oldboy63 ~]# awk 'NR==2;NR==4' regeix.txt 
Zhang  Xiaoyu    390320151   :155:90:201
Wu     Waiwai    70271111    :250:80:75
  1. 取出第二行到第四行信息
[root@oldboy63 ~]# awk 'NR==2,NR==4' regeix.txt 
Zhang  Xiaoyu    390320151   :155:90:201
Meng   Feixue    80042789    :250:60:50
Wu     Waiwai    70271111    :250:80:75

7.5.2.2 特殊模式BEGIN和END模式
BEGIN处理文件之前,先做什么事情

[root@oldboy63 ~]# awk 'BEGIN{print "姓氏" " " "名字"" " "ID号码" " " "捐款钱数"}{print $0}' regeix.txt |column -t
姓氏   名字      ID号码      捐款钱数
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

BEGIN用于计算

[root@oldboy63 ~]# awk 'BEGIN{print 2%3}'
2
[root@oldboy63 ~]# awk 'BEGIN{print 2-3}'
-1

BEGIN用于修改内置变量

[root@oldboy63 ~]# awk 'BEGIN{FS="[ :]+"}/Xiaoyu/{print $4,$5,$6}' regeix.txt 
155 90 201
[root@oldboy63 ~]# awk -vFS="[ :]+" '/Xiaoyu/{print $4,$5,$6}' regeix.txt
155 90 201
[root@oldboy63 ~]# awk -voldboy="4" '/Xiaoyu/{print oldboy}' regeix.txt
4

END在处理之后,在做什么事情

[root@oldboy63 ~]# awk '{print $0}END{print "学生捐款表"}' regeix.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
学生捐款表

对行数进行统计

[root@oldboy63 ~]# awk '{i++}END{print i}' regeix.txt 
9

对数值求值运算

[root@oldboy63 ~]# seq 10|awk '{sum=sum+$1}END{print sum}'
55
上一篇下一篇

猜你喜欢

热点阅读