AI智能
改变未来

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

文章目录

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

[/ul]

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 -nKernel IP routing tableDestination     Gateway         Genmask         Flags Metric Ref    Use Iface0.0.0.0         192.168.0.1     0.0.0.0         UG    100    0        0 eth0169.254.169.254 192.168.0.1     255.255.255.255 UGH   100    0        0 eth0192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0

方法一:

[root@ecs-c13b awk]# route -n |grep -v ^KernelDestination     Gateway         Genmask         Flags Metric Ref    Use Iface0.0.0.0         192.168.0.1     0.0.0.0         UG    100    0        0 eth0169.254.169.254 192.168.0.1     255.255.255.255 UGH   100    0        0 eth0192.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 1dDestination     Gateway         Genmask         Flags Metric Ref    Use Iface0.0.0.0         192.168.0.1     0.0.0.0         UG    100    0        0 eth0169.254.169.254 192.168.0.1     255.255.255.255 UGH   100    0        0 eth0192.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 Iface0.0.0.0         192.168.0.1     0.0.0.0         UG    100    0        0 eth0169.254.169.254 192.168.0.1     255.255.255.255 UGH   100    0        0 eth0192.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.txtBeth    4.00    0Dan     3.75    0kathy   4.00    10Mark    5.00    20Mary    5.50    22Susie   4.25    18

1. 打印特定字段
[root@ mysql-master ~]#  awk \'{print $1,$3}\' data.txtBeth 0Dan 0kathy 10Mark 20Mary 22Susie 18

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

2. NF, 字段数量

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

[root@ mysql-master ~]# awk \'{print NF, $1, $NF}\' data.txt3 Beth 03 Dan 03 kathy 103 Mark 203 Mary 223 Susie 18

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

4. 打印行号

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

[root@ mysql-master ~]# awk \'{print NR,$0}\' data.txt1 Beth	4.00	02 Dan	3.75	03 kathy	4.00	104 Mark	5.00	205 Mary	5.50	226 Susie	4.25	18

5. 在输出中添加内容

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

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

6. 自定义格式输出

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

[root@ecs-c13b awk]# awk -F: \'{printf \"USERNAME:%-15s %15s\\n\",$1,$NF}\' /etc/passwdUSERNAME:root                  /bin/bashUSERNAME:bin               /sbin/nologinUSERNAME: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,用之前都需要花一些精力把语法搞明白。

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

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 【shell】shell脚本实战-awk使用案例