一道linux shell面试题:如何用shell命令统计排序网站域名的访问量。

一道linux shell面试题:如何用shell命令统计排序网站域名的访问量。,第1张

第一个“|” 后面紧跟的是awk命令

这个命令含义是:将前面log中文件按“空格”或“制表符”分割,然后再以“/”分割第7个域,存入数组“D”中,这个域应该是网址,网址的格式一般是“http://zhidao.baidu.com/question/210746146.html”,所以以“/”分割后得到的第三个域 D[3] 就是“zhidao.baidu.com”,将这个字符串作为 key 存入数组 A 中,并且遇到相同的字符串时,A[key] 就加1,这样在awk 的END 段遍历数组A 就可以得到 key 和 key的计数(A[key]) 了

下一个“|”后面跟的命令 sort -nr 是指 按自然数大小(-n)和反序(-r) 排列

最后个“|”后面跟的命令 head 就是看输出的前10行

很多时候我们会遇到服务器遭受 cc 或 syn 等攻击,如果发现自己的网站访问异常缓慢且流量异常。可以使用系统内置 netstat 命令 简单判断一下服务器是否被攻击。常用的 netstat 命令

该命令将显示所有活动的网络连接。

查看同时连接到哪个服务器 IP 比较多,cc 攻击用。使用双网卡或多网卡可用。

查看哪些 IP 连接到服务器连接多,可以查看连接异常 IP。

显示所有 80 端口的网络连接并排序。这里的 80 端口是 http 端口,所以可以用来监控 web 服务。如果看到同一个 IP 有大量连接的话就可以判定单点流量攻击了。

这个命令可以查找出当前服务器有多少个活动的 SYNC_REC 连接。正常来说这个值很小,最好小于 5。 当有 Dos 攻击或的时候,这个值相当的高。但是有些并发很高的服务器,这个值确实是很高,因此很高并不能说明一定被攻击。

列出所有连接过的 IP 地址。

列出所有发送 SYN_REC 连接节点的 IP 地址。

使用 netstat 命令计算每个主机连接到本机的连接数。

列出所有连接到本机的 UDP 或者 TCP 连接的 IP 数量。

检查 ESTABLISHED 连接并且列出每个 IP 地址的连接数量。

列出所有连接到本机 80 端口的 IP 地址和其连接数。80 端口一般是用来处理 HTTP 网页请求。

显示连接 80 端口前 10 的 ip,并显示每个 IP 的连接数。这里的 80 端口是 http 端口,所以可以用来监控 web 服务。如果看到同一个 IP 有大量连接的话就可以判定单点流量攻击了。

在上文中,我们已经详细介绍 linux 三剑客的基本使用,接下来我们看看具体在性能测试领域的运用,本文主要介绍的是在 Tomcat 和 Nginx access日志的统计分析。

server.xml 使用配置方式,%D-请求时间,%F-响应时间

字段说明如下:

日志样例:

使用默认 combined 的经典格式上扩展response_time&upstream_response_time

nginx.conf 使用配置方式:

字段说明如下:

日志示例:

为了能理解 AWK 程序,我们下面概述其基本知识。

模式( pattern ) 用于匹配输入中的每行文本。对于匹配上的每行文本,awk 都执行对应的 动作( action )。模式和动作之间使用花括号隔开。awk 顺序扫描每一行文本,并使用 记录分隔符(一般是换行符)将读到的每一行作为 记录,使用 域分隔符( 一般是空格符或制表符 ) 将一行文本分割为多个 域, 每个域分别可以使用 2, … 表示。1 表示第一个域,表示第二个域,n 表示第 n 个域。 $0 表示整个记录。模式或动作都可以不指定,缺省模式的情况下,将匹配所有行。缺省动作的情况下,将执行动作 {print},即打印整个记录。

此处使用Nginx access.log 举例,Tomcat 日志自己举一反三。 使用 awk 分解出Nginx access日志中的信息

以此类推…… 当我们使用默认的域分割符时,我们可以从日志中解析出下面不同类型的信息:

我们不难发现,仅使用默认的域分隔符,不方便解析出请求行、引用页和浏览器类型等其他信息,因为这些信息之中包含不确定个数的空格。 因此,我们需要把域分隔符修改为 “ ,就能够轻松读出这些信息。

注意:这里为了避免 Linux Shell 误解 “ 为字符串开始,我们使用了反斜杠,转义了 “ 。 现在,我们已经掌握了 awk 的基本知识,以及它是怎样解析日志的。

此处使用Nginx access.log 举例,Tomcat 日志自己举一反三。

如果我们想知道那些类型的浏览器访问过网站,并按出现的次数倒序排列,我可以使用下面的命令:

此命令行首先解析出浏览器域,然后使用管道将输出作为第一个 sort 命令的输入。第一个 sort 命令主要是为了方便 uniq 命令统计出不同浏览器出现的次数。最后一个 sort 命令将把之前的统计结果倒序排列并输出。

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

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

HTTP 协议状态码定义可以参阅: https://www.w3.org/Protocols/rfc2616/rfc2616.html

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

统计所有状态码为 404 的请求

现在我们假设某个请求 ( 例如 : URI: /path/to/notfound ) 产生了大量的 404 错误,我们可以通过下面的命令找到这个请求是来自于哪一个引用页,和来自于什么浏览器。

有时候会发现其他网站出于某种原因,在他们的网站上使用保存在自己网站上的图片。如果您想知道究竟是谁未经授权使用自己网站上的图片,我们可以使用下面的命令:

注意:使用前,将 www.example.com 修改为自己网站的域名。

统计共有多少个不同的 IP 访问:

统计每一个 IP 访问了多少个页面:

将每个 IP 访问的页面数进行从小到大排序:

统计 2018 年 8 月 31 日 14 时内有多少 IP 访问 :

统计访问最多的前十个 IP 地址

查看某一个 IP访问了哪些页面:

统计某个 IP 的详细访问情况,按访问频率排序

列出传输大小最大的几个文件

列出输出大于 204800 byte ( 200kb) 的页面以及对应页面发生次数

列出访问最频的页面(TOP100)

列出访问最频的页面([排除php页面】(TOP100)

列出页面访问次数超过100次的页面

列出最近1000条记录,访问量最高的页面

统计每分钟的请求数,top100的时间点(精确到分钟)

统计每小时的请求数,top100的时间点(精确到小时)

统计每秒的请求数,top100的时间点(精确到秒)

统计当天的 pv

说明:

可以使用下面的命令统计出所有响应时间超过 3 秒的日志记录。

注意:NF 是当前记录中域的个数。$NF 即最后一个域。

列出php页面请求时间超过3秒的页面,并统计其出现的次数,显示前100条

列出相应时间超过 5 秒的请求,显示前20条

统计蜘蛛抓取次数

统计蜘蛛抓取404的次数

通过本文的介绍,我相信同学们一定会发现 linux三剑客强大之处。在命令行中,它还能够接受,和执行外部的 AWK 程序文件,可以对文本信息进行非常复杂的处理,可以说“只有想不到的,没有它做不到的”。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8971121.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-23
下一篇 2023-04-23

发表评论

登录后才能评论

评论列表(0条)

保存