[root@bigdata27 exam]# echo '<123456>' | sed 's#123456#123456#g'
<123456>
[root@bigdata27 exam]# echo '<123456>' | sed 's#123456#<123456>#g'
<<123456>>
[root@bigdata27 exam]# 

echo 123456 想要的结果:<123456>

[root@bigdata27 exam]# echo '123456' | sed -r 's#(.*)#<\1>#g'
<123456>
[root@bigdata27 exam]# echo 123456 | sed -r 's#(.*)#<\1>#g'
<123456>

想要的结果:<1><2><3><4><5><6>

[root@bigdata27 exam]# echo 123456 | sed -r 's#(.)#<\1>#g'
<1><2><3><4><5><6>

echo '11222233333344442222266668888990000999' 想要结果 11 2222 333333 4444 22222 6666 8888 99 0000 999

提取IP地址

[root@bigdata27 exam]# ip a s em1 | sed -n 3p |sed -r 's#^.*et (.*)/.*$#\1#g'
172.16.10.27

[root@bigdata27 exam]# ip a s em1 | sed -rn '3s#^.*et (.*)/.*$#\1#gp'
172.16.10.27

提取ifconfig em1 中ip地址和掩码:

[root@bigdata27 exam]# ifconfig em1 |sed -rn 2p
        inet 172.16.10.27  netmask 255.255.255.0  broadcast 172.16.10.255
[root@bigdata27 exam]# ifconfig em1 |sed -rn '2s#^.*et (.*) .*k (.*) br.*$#\1 \2#gp'
172.16.10.27  255.255.255.0 

awk命令格式 参数 -F -v 修改或创建awk变量 -F= -vFS=

awk '找谁{干啥}' 找谁 模式 pattern 条件 干啥 动作 action 命令

显示第1行的第1列

[root@bigdata27 exam]# ip a s em1
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 18:66:da:eb:0c:14 brd ff:ff:ff:ff:ff:ff
    inet 172.16.10.27/24 brd 172.16.10.255 scope global em1
       valid_lft forever preferred_lft forever
    inet6 fe80::1a66:daff:feeb:c14/64 scope link 
       valid_lft forever preferred_lft forever
[root@bigdata27 exam]# ip a s em1 |awk 'NR==1{print $1}'
2:

awk执行过程

‘NR==1{print $1} 条件: NR==1 找出第1行 动作: {print $1} 显示第1列

awk 行 与 列

行 record 记录 列 field 区域 字段 NR Number of Record 记录号 行号

[root@bigdata27 exam]# ip a s em1
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 18:66:da:eb:0c:14 brd ff:ff:ff:ff:ff:ff
    inet 172.16.10.27/24 brd 172.16.10.255 scope global em1
       valid_lft forever preferred_lft forever
    inet6 fe80::1a66:daff:feeb:c14/64 scope link 
       valid_lft forever preferred_lft forever
[root@bigdata27 exam]# ip a s em1 |awk 'NR==1{print $1}'
2:
[root@bigdata27 exam]# cat sed.txt 
101.oldboy,CEO
102,zhangyao.CTO
103,Alex.COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
[root@bigdata27 exam]# awk 'NR==3' /exam/sed.txt 
103,Alex.COO
[root@bigdata27 exam]# awk -F ',' '{print $2}' /exam/sed.txt 
CEO
zhangyao.CTO
Alex.COO
yy
feixue
lidao

-F 指定分隔符 指定新的菜刀

提取 ip a s em1 命令中的IP地址

[root@bigdata27 exam]# ifconfig em1 |awk 'NR==2{print $2}'
172.16.10.27
[root@bigdata27 exam]# ip a s em1 |awk 'NR==3{print $2}'
172.16.10.27/24

[root@bigdata27 exam]# ip a s em1 |awk -F '[ /]+' 'NR==3{print $3}'
172.16.10.27

取行 NR==1 取列 $数字 NF Number of Field 每行有多少列 $NF 最后一列

NR 行号 NF 列个数

$(NF-1) 倒数第2列

{print $1,$2,$3} {print $NF}

显示 /etc/passwd 第1列,第3列和最后一列

找谁 条件?

[root@bigdata27 ~]# awk -F':' '{print $1,$3,$NF}' /etc/passwd
root 0 /bin/bash
bin 1 /sbin/nologin
daemon 2 /sbin/nologin
adm 3 /sbin/nologin
lp 4 /sbin/nologin
sync 5 /bin/sync
shutdown 6 /sbin/shutdown
halt 7 /sbin/halt
mail 8 /sbin/nologin

显示 /exam/sed.txt 文件的内容和行号

[root@bigdata27 exam]# cat -n sed.txt 
     1	101.oldboy,CEO
     2	102,zhangyao.CTO
     3	103,Alex.COO
     4	104,yy,CFO
     5	105,feixue,CIO
     6	110,lidao,COCO
[root@bigdata27 exam]# awk '{print NR,$0}' sed.txt 
1 101.oldboy,CEO
2 102,zhangyao.CTO
3 103,Alex.COO
4 104,yy,CFO
5 105,feixue,CIO
6 110,lidao,COCO

对比三剑客

grep 过滤 过滤速度最快 sed 过滤 替换 修改文件内容 (增删改查) awk 过滤 取列 计算与统计

显示磁盘使用率大于10%的磁盘分区和挂载点(目录) 条件:磁盘使用率大于10% $5>10 动作:显示分区和挂载点 print $1,$NF

[root@bigdata27 exam]# df -h |awk '$5>10{print $1,$NF}'
文件系统 挂载点
/dev/mapper/centos-root /
tmpfs /run
/dev/mapper/centos-home /data
/dev/loop0 /media
/dev/sda2 /boot
[root@bigdata27 exam]# df -h
件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   50G   12G   39G   24% /
devtmpfs                  12G     0   12G    0% /dev
tmpfs                     12G   84K   12G    1% /dev/shm
tmpfs                     12G  346M   12G    3% /run
tmpfs                     12G     0   12G    0% /sys/fs/cgroup
/dev/mapper/centos-home   11T  3.8T  7.2T   35% /data
/dev/loop0               4.1G  4.1G     0  100% /media
/dev/sda2                497M  187M  311M   38% /boot
tmpfs                    2.4G   16K  2.4G    1% /run/user/42
tmpfs                    2.4G     0  2.4G    0% /run/user/0
[root@exam ~]#cat >>/oldboy/reg.txt<<EOF
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
EOF
[root@exam ~]# awk '/[0-9]/' /exam/reg.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

显示Xiaoyur的姓氏和ID号码 条件:找出Xiaoyu 第2列中包含Xiaoyu $2 ~ /Xiaoyu/

[root@exam ~]# awk '$2~/Xiaoyu/' /exam/reg.txt 
Zhang Xiaoyu    390320151  :155:90:201

~ 表示包含或匹配 动作: {显示姓氏和ID号} 动作: {print $1,$3}

[root@exam ~]# awk '$2~/Xiaoyu/{print $1,$3}' /exam/reg.txt 
Zhang 390320151
[root@exam ~]# 

接下来完成练习题并发出答案: 显示所有以一个D或X开头的人名全名 显示所有ID号友最后一位数字1或5的人的全名 显示Xiaoyu的捐款,每个值时都有以¥开头,如$520$200$135 显示所有人的命名,以姓,名的格式显示, 如Meng,Feixue

显示所有以一个D或X开头的人名全名: 条件:以一个D或X开头的人名 /^[DX]/

[root@exam ~]# awk '$2~/^[DX]/' /exam/reg.txt 
Zhang Dandan    41117397   :250:100:175
Zhang Xiaoyu    390320151  :155:90:201
Wang  Xiaoai    3515064655 :50:95:135
[root@exam ~]# awk '$2~/^[DX]/{print $1,$2}' /exam/reg.txt 
Zhang Dandan
Zhang Xiaoyu
Wang Xiaoai
[root@exam ~]# 

显示所有ID号友最后一位数字1或5的人的全名:

[root@exam ~]# awk '$3~/[15]$/' /exam/reg.txt 
Zhang Xiaoyu    390320151  :155:90:201
Wu    Waiwai    70271111   :250:80:75
Wang  Xiaoai    3515064655 :50:95:135
Li    Youjiu    918391635  :175:75:300
Lao   Nanhai    918391635  :250:100:175
[root@exam ~]# awk '$3~/(1|5)$/' /exam/reg.txt 
Zhang Xiaoyu    390320151  :155:90:201
Wu    Waiwai    70271111   :250:80:75
Wang  Xiaoai    3515064655 :50:95:135
Li    Youjiu    918391635  :175:75:300
Lao   Nanhai    918391635  :250:100:175
[root@exam ~]# awk '$3~/[1|5]$/' /exam/reg.txt 
Zhang Xiaoyu    390320151  :155:90:201
Wu    Waiwai    70271111   :250:80:75
Wang  Xiaoai    3515064655 :50:95:135
Li    Youjiu    918391635  :175:75:300
Lao   Nanhai    918391635  :250:100:175
[root@exam ~]# 

显示所有以一个D或X开头的人名全名:

[root@exam ~]# awk '$2~/^[D|X]/' /exam/reg.txt 
Zhang Dandan    41117397   :250:100:175
Zhang Xiaoyu    390320151  :155:90:201
Wang  Xiaoai    3515064655 :50:95:135

[root@exam ~]# awk '$2~/^[D|X]/{print $1,$2}' /exam/reg.txt 
Zhang Dandan
Zhang Xiaoyu
Wang Xiaoai
[root@exam ~]# 

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

[root@exam ~]# awk '$3~/[1|5]$/' /exam/reg.txt 
Zhang Xiaoyu    390320151  :155:90:201
Wu    Waiwai    70271111   :250:80:75
Wang  Xiaoai    3515064655 :50:95:135
Li    Youjiu    918391635  :175:75:300
Lao   Nanhai    918391635  :250:100:175
[root@exam ~]# awk '$3~/[1|5]$/{print $1,$2}' /exam/reg.txt 
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
[root@exam ~]# 

显示Xiaoyu的捐款,每个值时都有以¥开头,如$520$200$135

[root@exam ~]# awk -F'[ :]+' '{print "$"$4"$"$5"$"NF}' /exam/reg.txt 
$250$100$6
$155$90$6
$250$60$6
$250$80$6
$250$100$6
$50$95$6
$250$168$6
$175$75$6
$250$100$6
[root@exam ~]# 

[root@exam ~]# awk '{print $NF}' /exam/reg.txt |tr ':' '$'
$250$100$175
$155$90$201
$250$60$50
$250$80$75
$250$100$175
$50$95$135
$250$168$200
$175$75$300
$250$100$175
[root@exam ~]# 
[root@exam ~]# awk '$2~/^[Xiaoyu]/{print $4}' /exam/reg.txt 
:155:90:201
:50:95:135
[root@exam ~]# 

函数(别人定义好的命令)

[root@exam ~]# sed 's#:#$#g' /exam/reg.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@exam ~]#

gsub(/:/,"$") gsub (/:/,"$",$NF,$0) gsub(/找谁/,"替换为什么",哪一列)

 [root@exam ~]# awk '{gsub(/:/,"$");print }' /exam/reg.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@exam ~]# 

显示所有人名,以姓,名的格式显示,如Meng,Feixue

[root@exam ~]# awk '{print $1,$2}' /exam/reg.txt 
Zhang Dandan
Zhang Xiaoyu
Meng Feixue
Wu Waiwai
Liu Bingbing
Wang Xiaoai
Zi Gege
Li Youjiu
Lao Nanhai
[root@exam ~]# awk '{print $1","$2}' /exam/reg.txt 
Zhang,Dandan
Zhang,Xiaoyu
Meng,Feixue
Wu,Waiwai
Liu,Bingbing
Wang,Xiaoai
Zi,Gege
Li,Youjiu
Lao,Nanhai
[root@exam ~]#
[root@exam ~]# awk 'NR==1{print $1"####"$2}' /exam/reg.txt 
Zhang####Dandan
[root@exam ~]# 


OFS output field separator 输出分隔符 awk显示每一列的时候分隔符

[root@exam ~]# awk -v OFS="@ | @" '{print $1,$2}' /exam/reg.txt
Zhang@ | @Dandan
Zhang@ | @Xiaoyu
Meng@ | @Feixue
Wu@ | @Waiwai
Liu@ | @Bingbing
Wang@ | @Xiaoai
Zi@ | @Gege
Li@ | @Youjiu
Lao@ | @Nanhai
[root@exam ~]# 

OFS的内容 相当于是 ,的内容 -v 创建或修改awk变量

[root@exam ~]# awk -vOFS="###" '{print $1,$2}' /exam/reg.txt 
Zhang###Dandan
Zhang###Xiaoyu
Meng###Feixue
Wu###Waiwai
Liu###Bingbing
Wang###Xiaoai
Zi###Gege
Li###Youjiu
Lao###Nanhai
[root@exam ~]# 
[root@exam ~]# cat >/exam/sed.txt<<EOF
> 101,oldboy,CEO
> 102,zhangyao,CTO
> 103,Alex,COO
> 104,yy,CFO
> 105,feixue,CIO
> 110,lidao,COCO
> EOF
[root@exam ~]# cat /exam/sed.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
[root@exam ~]# sed -n '1,5p' /exam/sed.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@exam ~]# awk 'NR==1,NR==5' /exam/sed.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@exam ~]# 

正则表达式作为条件:

  1. ~ 包含 !~ 不包含 2.正则 ^ $ 3.条件 动作

范围:

[root@exam ~]# sed -n '1,5p' /exam/sed.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@exam ~]# awk 'NR==1,NR==5' /exam/sed.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@exam ~]# 

[root@exam ~]# sed -n '/101/,/105/p' /exam/sed.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@exam ~]# 

[root@exam ~]# awk '/101/,/105/' /exam/sed.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@exam ~]# 

显示了 /etc/passwd中 从第3列等于0 到第3列等于1000的行

[root@exam ~]# awk -F: '$3==0,$3==1000' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
user01:x:1000:1000::/home/user01:/bin/bash
[root@exam ~]# awk -F: '$3~/^0$/,/^1000$/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
user01:x:1000:1000::/home/user01:/bin/bash
user02:x:1001:1001::/home/user02:/bin/bash
user03:x:1002:1002::/home/user03:/bin/bash
[root@exam ~]# 

从哪里来到哪里去 awk -F: '$3==0,#3==1000' /etc/passwd 精确 比较大小 awk -F: '$3==0,$3==1000' /etc/passwd

awk -F: '$3==0 && $3==1000' /etc/passwd

[root@exam ~]# awk 'BEGIN{print 1/3,1+4,3*3,1-3}'
0.333333 5 9 -2
[root@exam ~]# awk 'BEGIN{PRINT 2^4}'
[root@exam ~]# awk 'BEGIN{print 2^4}'
16
[root@exam ~]# awk 'BEGIN{print 2^10}'
1024
[root@exam ~]# awk 'BEGIN{print 2^20}
> ^C
[root@exam ~]# awk 'BEGIN{print 2^20}'
1048576
[root@exam ~]# awk 'BEGIN{print 2^40}'
1099511627776
[root@exam ~]# awk 'BEGIN{print 2**40}'
1099511627776
[root@exam ~]# 

awk特殊条件 BEGIN{ } BEGIN里面的内容会在awk读取文件之前执行 计算

[root@exam ~]# awk 'BEGIN{OFS="@@@"}{print $1,$2}'  /exam/reg.txt
Zhang@@@Dandan
Zhang@@@Xiaoyu
Meng@@@Feixue
Wu@@@Waiwai
Liu@@@Bingbing
Wang@@@Xiaoai
Zi@@@Gege
Li@@@Youjiu
Lao@@@Nanhai
[root@exam ~]# awk -vOFS="####" '{print $1,$2}' /exam/reg.txt 
Zhang####Dandan
Zhang####Xiaoyu
Meng####Feixue
Wu####Waiwai
Liu####Bingbing
Wang####Xiaoai
Zi####Gege
Li####Youjiu
Lao####Nanhai
[root@exam ~]# cat /exam/reg.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@exam ~]# awk {print $1,$2} /exam/reg.txt 
awk: cmd. line:1: {print
awk: cmd. line:1:       ^ unexpected newline or end of string
[root@exam ~]# awk '{print $1,$2}' /exam/reg.txt 
Zhang Dandan
Zhang Xiaoyu
Meng Feixue
Wu Waiwai
Liu Bingbing
Wang Xiaoai
Zi Gege
Li Youjiu
Lao Nanhai
[root@exam ~]# 

END{ } ***** awk读取文件内容之后执行END{ }显示里面的内容 使用awk 进行统计:先进行计算,最后END{ }显示最后结果

i=i+1 i++ 统计出现的总次数 计数 i=i+$数字 i+=$数字 统计一共有多少 求和

统计 /etc/services 文件中空行的数量

[root@exam ~]# awk '/^$/{i=i+1;print i}' /etc/services
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@exam ~]# 

遇到空行 i=i+1 计算之后i的内容 1 i=0+1 1 2 i=1+1 2 3 i

[root@exam ~]# awk '/^$/{i++}END{print i}' /etc/services
17
[root@exam ~]# ^C

计算1+2+3....+100 seq 100


[root@exam ~]# seq 10 | awk '{j=j+$1; print j}'
1
3
6
10
15
21
28
36
45
55
[root@exam ~]# 

执行过程 j=j+$1 计算之后j的内容 1 j=0+1 1 2 j=1+2 3 3 j+3+3 6 4 j+6+4 10 5 6 7 8 9 10

[root@exam ~]# seq 10 | sort -rn
10
9
8
7
6
5
4
3
2
1
[root@exam ~]# seq 10 | sort -rn -k1
10
9
8
7
6
5
4
3
2
1
[root@exam ~]# 

sort -r 逆序排序 -n 作为数字 进行排序 -k 指定某一列 进行排序 -t 指定分隔符

awk完整的执行过程

awk 取行 取列

awk条件 比较 比大小 数字 正则 文字符号 范围 特殊BEGIN和 END

计算 i=i+1 i++ 计数 i=i+某一列 i=i+$1 i+=$1 求和

回顾

三剑客

grep 过滤 速度快 加上颜色 显示执行过程 sed 过滤 取行 替换 修改文件内容 增删改查 目标 动作 awk 过滤 取列 计算 各种条件(比较 正则 范围特殊 目标 动作