【shell】shell脚本实战-awk使用案例

举报
互联网老辛 发表于 2021/06/09 01:06:55 2021/06/09
【摘要】 文章目录 1. 使用NR行号来定位提取IP2. 去除首行3. 其他使用1. 打印特定字段2. NF, 字段数量3. 计算和打印4. 打印行号5. 在输出中添加内容6. 自定义格式输出 4. 检查服务器是否受到DDOS攻击的脚本总结 1. 使用NR行号来定位提取IP [root@ecs-c13b awk]# ifconfig eth0 |awk...

1. 使用NR行号来定位提取IP

[root@ecs-c13b awk]# ifconfig eth0 |awk -F " " 'NR==2{print $2}'
192.168.0.192


  
 
  • 1
  • 2
  • 3

2. 去除首行

[root@ecs-c13b awk]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 100 0 0 eth0
169.254.169.254 192.168.0.1 255.255.255.255 UGH   100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0   U 100 0 0 eth0

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

方法一:

[root@ecs-c13b awk]# route -n |grep -v ^Kernel
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 100 0 0 eth0
169.254.169.254 192.168.0.1 255.255.255.255 UGH   100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0   U 100 0 0 eth0
[root@ecs-c13b awk]# 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

方法二:

[root@ecs-c13b awk]# route -n |sed 1d
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 100 0 0 eth0
169.254.169.254 192.168.0.1 255.255.255.255 UGH   100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0   U 100 0 0 eth0
[root@ecs-c13b awk]# 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

方法三:

[root@ecs-c13b awk]# route -n |awk 'NR!=1 {print $0}'
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 100 0 0 eth0
169.254.169.254 192.168.0.1 255.255.255.255 UGH   100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0   U 100 0 0 eth0
[root@ecs-c13b awk]# 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3. 其他使用

创建练习文件:

[root@ mysql-master ~]# vim data.txt
Beth 4.00 0
Dan 3.75 0
kathy   4.00 10
Mark 5.00 20
Mary 5.50 22
Susie   4.25 18

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
1. 打印特定字段
[root@ mysql-master ~]#  awk '{print $1,$3}' data.txt
Beth 0
Dan 0
kathy 10
Mark 20
Mary 22
Susie 18

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在 print 语句中被逗号分割的表达式, 在默认情况下他们将会用一个空格分割 来输出. 每一行 print 生成的内容都会以一个换行符作为结束. 但这些默认行 为都可以自定义。

2. NF, 字段数量

依次打印出每一行的字段数量, 第一个字段的值, 最后一个字段的值:

[root@ mysql-master ~]# awk '{print NF, $1, $NF}' data.txt
3 Beth 0
3 Dan 0
3 kathy 10
3 Mark 20
3 Mary 22
3 Susie 18

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
3. 计算和打印
[root@ mysql-master ~]# awk '{print $1, $2 * $3}' data.txt
Beth 0
Dan 0
kathy 40
Mark 100
Mary 121
Susie 76.5

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
4. 打印行号

Awk提供了另一个内建变量, 叫做 NR, 它会存储当前已经读取了多少行的计数. 我们可以使用 NR 和 $0 给 emp.data 的每一行加上行号:

[root@ mysql-master ~]# awk '{print NR,$0}' data.txt
1 Beth	4.00	0
2 Dan	3.75	0
3 kathy	4.00	10
4 Mark	5.00	20
5 Mary	5.50	22
6 Susie	4.25	18

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
5. 在输出中添加内容

当然也可以在字段中间或者计算的值中间打印输出想要的内容:

[root@ mysql-master ~]# awk '{print "total pay for", $1, "is", $2 * $3}' data.txt
total pay for Beth is 0
total pay for Dan is 0
total pay for kathy is 40
total pay for Mark is 100
total pay for Mary is 121
total pay for Susie is 76.5

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
6. 自定义格式输出

第1列使用15个字符宽度左对齐输出,最后一列使用15个字符宽度右对齐输出

[root@ecs-c13b awk]# awk -F: '{printf "USERNAME:%-15s %15s\n",$1,$NF}' /etc/passwd
USERNAME:root /bin/bash
USERNAME:bin /sbin/nologin
USERNAME:daemon /sbin/nologin


  
 
  • 1
  • 2
  • 3
  • 4
  • 5

4. 检查服务器是否受到DDOS攻击的脚本

[root@ecs-c13b awk]# netstat -ntu |awk '{print$5}'|cut -d: -f1 |uniq -c |sort -n 1 100.125.1.41 1 114.181.58.197 1 120.245.114.128 1 45.79.47.198 1 Address 1 servers)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

总结

awk的内容还远远未完,还需要大量的练习。sed,grep,awk,用之前都需要花一些精力把语法搞明白。

后面我会做个思维导图来梳理下这三个内容,帮助大家记忆。

文章来源: zmedu.blog.csdn.net,作者:互联网老辛,版权归原作者所有,如需转载,请联系作者。

原文链接:zmedu.blog.csdn.net/article/details/108100708

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。