首页
运维教程
Linux基础
系统服务
系统架构
数据库
shell脚本
虚拟化
大数据
DevOps
企业案例
运维开发
python
go语言
运维安全
行业资讯
网络基础
系统安全
运维面试
学习路线
学习方法
面试题库
职场解惑
软件
运维软件
办公软件
书籍资源
技术陪跑营
重要信息
首页 运维教程shell脚本【shell】shell脚本实战-awk使用案例

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

文章目录

  1. 使用NR行号来定位提取IP
  2. 去除首行
  3. 其他使用
  4. 打印特定字段
  5. NF, 字段数量
  6. 计算和打印
  7. 打印行号
  8. 在输出中添加内容
  9. 自定义格式输出
  10. 检查服务器是否受到DDOS攻击的脚本
    总结

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

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

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

方法一:

[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]# 

方法二:

[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]# 

方法三:

[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]# 

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. 打印特定字段
[root@ mysql-master ~]#  awk '{print 1,3}' data.txt
Beth 0
Dan 0
kathy 10
Mark 20
Mary 22
Susie 18

在 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
3. 计算和打印
[root@ mysql-master ~]# awk '{print 1,2 * $3}' data.txt
Beth 0
Dan 0
kathy 40
Mark 100
Mary 121
Susie 76.5
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
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
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

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)

总结

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

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

本文链接:http://www.geekyunwei.com/1119.html

网友评论comments

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

暂无评论

Copyright © 2021 极客运维 公众号《极客运维之家》
扫二维码
扫二维码
返回顶部