Linux awk统计日志中出现过的IP(或出现次数最多的N个IP)

Linux awk统计日志中出现过的IP(或出现次数最多的N个IP)

大家好,又见面了,我是全栈君。

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk的用法

awk 'BEGIN{ commands } pattern{ commands } END{ commands }'

第一步:运行BEGIN{ commands }语句块中的语句。

第二步:从文件或标准输入(stdin)读取一行。然后运行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行反复这个过程。直到文件所有被读取完成。

第三步:当读至输入流末尾时,运行END{ commands }语句块。

BEGIN语句块在awk開始从输入流中读取行之前被运行,这是一个可选的语句块,比方变量初始化、打印输出表格的表头等语句通常能够写在BEGIN语句块中。

END语句块在awk从输入流中读取全然部的行之后即被运行。比方打印全部行的分析结果这类信息汇总都是在END语句块中完毕,它也是一个可选语句块。

pattern语句块中的通用命令是最重要的部分,它也是可选的。假设没有提供pattern语句块,则默认运行{ print },即打印每个读取到的行。awk读取的每一行都会运行该语句块。

这三个部分缺少任何一部分都可以。

可用awk来统计固定格式日志里的一些数据,如日志中出现过所有不同的IP

awk ‘{i=$1;count[i]++}END{for(i in count)print(i,count[i])}’ /var/log/httpd/access_log

awk对文件进行流处理,每次读取一行。$1就是IP,count[i]++是将IP作为一个数组的下标,并且使得统计这个IP所对应的数组元素自增1.END后面的语句是打印结果,只执行一次。

也可以用来找出访问次数最多的ip。

awk '{a[$1] += 1;} END {for (i in a) printf("%d %s\n", a[i], i);}' 日志文件 | sort -n | tail -n 10 #用tail显示最后10行

首先用awk统计出来一个列表,然后用sort进行排序,最后用tail取最后的10个。

以上参数可以略作修改显示更多的数据,比如将tail加上-n参数等,另外日志格式不同命令也可能需要稍作修改。

 

当前WEB服务器中联接次数最多的ip地址

netstat -ntu |awk '{print $5}' |sort | uniq -c| sort -nr

查看日志中访问次数最多的前10个IP

cat access_log |cut -d ' ' -f 1 | sort |uniq -c | sort -nr | awk '{print $0 }' | head -n 10 | less

查看日志中出现100次以上的IP

cat access_log |cut -d ' ' -f 1 | sort |uniq -c | awk '{if ($1 > 100) print $0}'|sort -nr | less

查看最近访问量最高的文件

cat access_log | tail -10000 | awk '{print $7}' | sort | uniq -c | sort -nr | less

查看日志中访问超过100次的页面

cat access_log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less

统计某url,一天的访问次数

cat access_log | grep '12/Aug/2009' | grep '/images/index/e1.gif' | wc | awk '{print $1}'

前五天的访问次数最多的网页

cat access_log | awk '{print $7}' | uniq -c | sort -n -r | head -20

从日志里查看该ip在干嘛

cat access_log | grep 218.66.36.119 | awk '{print $1"\t"$7}' | sort | uniq -c | sort -nr | less

列出传输时间超过 30 秒的文件

cat access_log | awk '($NF > 30){print $7}' | sort -n | uniq -c | sort -nr | head -20

列出最最耗时的页面(超过60秒的)

cat access_log | awk '($NF > 60 && $7~/\.php/){print $7}' | sort -n | uniq -c | sort -nr | head -100

查看23:27分,访问api/v1开头的接口

cat access-2020-09-06.log | grep 2020-09-06T23:27|grep /api/v1
cat access-2020-09-06.log | grep 2020-09-06T23:27|grep /api/v1|wc -l  //api/vi 开头接口多少行

发现系统存在的问题

我们可以使用下面的命令行,统计服务器返回的状态码,发现系统可能存在的问题。

 awk '{print $9}' access.log | sort | uniq -c | sort

正常情况下,状态码 200 或 30x 应该是出现次数最多的。40x 一般表示客户端访问问题。50x 一般表示服务器端问题。

下面是一些常见的状态码:

  • 200 – 请求已成功,请求所希望的响应头或数据体将随此响应返回。
  • 206 – 服务器已经成功处理了部分 GET 请求
  • 301 – 被请求的资源已永久移动到新位置
  • 302 – 请求的资源现在临时从不同的 URI 响应请求
  • 400 – 错误的请求。当前请求无法被服务器理解
  • 401 – 请求未授权,当前请求需要用户验证。
  • 403 – 禁止访问。服务器已经理解请求,但是拒绝执行它。
  • 404 – 文件不存在,资源在服务器上未被发现。
  • 500 – 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。
  • 503 – 由于临时的服务器维护或者过载,服务器当前无法处理请求。

HTTP 协议状态码定义可以参阅:Hypertext Transfer Protocol — HTTP/1.1

有关状态码的 awk 命令示例:

Linux awk统计日志中出现过的IP(或出现次数最多的N个IP)

awk '{print $8}'  access-2020-09-18.log | sort | uniq -c | sort  //日志文件中装态码统计

1. 查找并显示所有状态码为 404 的请求

 awk '($9 ~ /404/)' access.log
 awk '($8 ~ /404/)' access-2020-09-18.log|head -20

 Linux awk统计日志中出现过的IP(或出现次数最多的N个IP)

2. 统计所有状态码为 404 的请求(不带搜索文件的,不能用)

 awk '($9 ~ /404/)'

3.查询特定接口,状态码不是200的

awk '($8 !=200)' access-2020-09-18.log|grep "/api/v1/user/updateHeadImg"

Linux awk统计日志中出现过的IP(或出现次数最多的N个IP)

awk '($8 =499)' access-2020-09-18.log|grep "/api/v1"|head -n 100000|tail -n 95000  //状态码为499的特定接口,第95000至10万行

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111703.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MySQL数据库:参数优化

    MySQL数据库:参数优化

    2021年4月10日
    146
  • ORACLE分页查询SQL语句(最有效的分页)

    ORACLE分页查询SQL语句(最有效的分页)**一、效率高的写法**1.无ORDERBY排序的写法。(效率最高)(经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!)SELECT*FROM(SELECTROWNUMASrowno,t.*FROMemptWHEREhire_dateBETWEENTO_DATE…

    2022年4月29日
    535
  • WindowManager.LayoutParams.FLAG_SECURE_congestion window

    WindowManager.LayoutParams.FLAG_SECURE_congestion windowpublicstaticclassWindowManager.LayoutParamsextends ViewGroup.LayoutParamsimplements Parcelablejava.lang.Object   ?android.view.ViewGroup.LayoutParams    ?

    2022年9月21日
    3
  • rabbitmq使用mqtt协议[通俗易懂]

    rabbitmq使用mqtt协议[通俗易懂]提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、rabbitmq是什么?二、mqtt协议是什么?三、使用步骤1.引入库2.读入数据总结前言在网上学习物联网,发现有人可以用springboot+rabbitmq可以搭建物联网(IOT)平台,rabbitmq不是消息队列吗,原来rabbitmq有两种协议,消息队列是用的AMQP协议,而用在智能硬件中的是MQTT协议。一、rabbitmq是什么?示例:pandas是基于NumPy的一种工具,该工具是为了解

    2022年10月3日
    5
  • 如何进行ghost备份_linux一键ghost吗

    如何进行ghost备份_linux一键ghost吗工具:ghost。exeimagefile(最小而完整的系统所作出来的image文件)。Ghostlinux主要几个步骤:1、bootfromcd2、restoreredhatimageintoharddisk3、definemajorharddiskspaceasreiserfspartition4、update/etc/lilo。confan…

    2025年9月20日
    3
  • 数组和集合的区别有哪些?

    数组和集合的区别有哪些?更多免费教学文章请关注这里一 数组数组是 java 语言内置的数据类型 他是一个线性的序列 所有可以快速访问其他的元素 数组和其他语言不同 当你创建了一个数组时 他的容量是不变的 而且在生命周期也是不能改变的 还有 JAVA 数组会做边界检查 如果发现有越界现象 会报 RuntimeExcep 异常错误 当然检查边界会以效率为代价 二 集合 JAVA 还提供其他集合 list map set 他们

    2025年7月8日
    2

发表回复

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

关注全栈程序员社区公众号