博客
关于我
关于AWK的10个经典案例
阅读量:661 次
发布时间:2019-03-15

本文共 2049 字,大约阅读时间需要 6 分钟。

Nginx日志分析及其他AWK实用案例教程

1. Nginx日志分析

统计访问IP次数

awk '{a[$1]++}END{for(v in a) print v, a[v]}' access.log

统计访问大于100次的IP

awk '{a[$1]++}END{for(v in a){if(a[v] > 100) print v, a[v]}}' access.log

统计前10名访问IP

awk '{a[$1]++}END{for(v in a) print v, a[v] | "sort -k2 -nr | head -10"}' access.log

统计特定时间段内的访问IP

awk '$4 >="[02/Jan/2017:00:02:00" && $4 <="[02/Jan/2017:00:03:00" {a[$1]++}END{for(v in a) print v, a[v]}' access.log

统计上一分钟访问量

date=$(date -d '-1 minute')awk -v date=$date '$4~date{c++}END{print c}' access.log

统计最热门10个页面

awk '{a[$7]++}END{for(v in a) print v, a[v] | "sort -k1 -nr | head -n10"}' access.log

统计URL数量及内容大小

awk '{a[$7]++; size[$7] += $10}END{for(v in a) print a[v], v, size[v]}' access.log

统计每个IP的状态码数量

awk '{a[$1" "$9]++}END{for(v in a) print v, a[v]}' access.log

统计404状态码的访问IP

awk '{if($9 ~/404/) a[$1" "$9]++}END{for(i in a) print v, a[v]}' access.log

2. 两个文件的内容差异对比

找出b文件在a文件中的相同记录

awk 'FNR==NR{a[$0]; next}{if($0 in a) print $0}' a b

找出b文件中不在a文件中的记录

awk 'FNR==NR{a[$0]=1; next}{if(a[$0]!=1) print}' a b

3. 文件的内容合并

将a文件的内容按第二列合并到一行

awk 'FNR==NR{a[$1]=$0; next}{print a[$1], $2}' a bzhangsan 20 manlisi 23 womanwangwu 29 man

合并同一IP的服务名

awk 'BEGIN{FS=":";OFS=":"}{a[$1]=a[$1] $2}END{for(v in a) print v, a[v]}' a

4. 去除文本的第一行和最后一行

原始内容

seq 5 | awk 'NR>2{print s}{s=$0}'

5. 字符串拆分

方法1

echo "hello" | awk -F '"' '{split($0, a, "")}; for(v in a) print a[v]'

方法2

echo "hello" | awk '{split($0, a, "''"); for(v in a) print a[v]}'

6. 统计字符串中各字母出现的次数

示例

echo "a.b.c,c.d.e" | awk -F'[.,]' '{for(i=1; i<=NF; i++) a[$i]++}END{for(v in a) print v, a[v]'

7. 费用统计

示例

awk '{name[$1]++; cost[$1] += $2; number[$1] += $3} END{for(v in name) print v, cost[v], number[v]}'

8. 获取某列数字最大值

获取第三字段的最大值

awk 'BEGIN{max=0}{if($3 > max) max = $3} END{print max}'

打印达到最大值的行

awk 'BEGIN{max=0}{a[$0] = $3; if($3 > max) max = $3} END{for(v in a) if(a[v] == max) print v}'

9.290

10. Nginx upstream块内的后端IP及端口提取

示例

awk '/example-servers1/,/}/{if(NR>2)print s}{s=$2}' a

另一种实现方式

awk '/example-servers1/,/}/{if(i>1)print s}{s=$2; i++}' a

如果您需要进一步了解AWK脚本的使用方法和具体案例处理方式,欢迎随时交流!

转载地址:http://nixmz.baihongyu.com/

你可能感兴趣的文章
kubernetes 查看资源详细信息(describe)
查看>>
JAVA基础教程基本语法、对象和类
查看>>
JAVA基础知识之面向对象!
查看>>
Kubernetes 笔记 08 Deployment 副本管理 重新招一个员工来填坑
查看>>
Java基础知识陷阱系列
查看>>
java基础第七章异常_Java程序设计教学课件-第七章 异常处理.ppt
查看>>
Kubernetes 网络模型和网络通信
查看>>
Java基础系列
查看>>
Kubernetes 自定义服务的启动顺序
查看>>
java基础(2)-面向对象(1)
查看>>
Java基础,输入输出
查看>>
Kubernetes 访问集群 API 的方法
查看>>
java基础:12.5 缓存流 BufferReader、 PrintWriter、flush
查看>>
Java基础:Character 类概念、构造函数、实例方法、类方法
查看>>
Kubernetes 资源调度详解
查看>>
Java基础:Java 的工作原理和 Java 开发环境
查看>>
Java基础:StringBuffer类概念、构造函数、常用方法
查看>>
Kubernetes 部署 kubeflow1.7.0
查看>>
Java基础:变量(声明、赋值、引用)、基本数据类型、作用域
查看>>
Kubernetes 部署SonarQube
查看>>