我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何使用shell命令统计日志

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何使用shell命令统计日志

这篇文章给大家分享的是有关如何使用shell命令统计日志的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

前言

假设有一个包含下面内容的日志文件 access.log。我们以统计这个文件的日志为例。

date=2017-09-23 13:32:50 | ip=40.80.31.153 | method=GET | url=/api/foo/bar?params=something | status=200 | time=9.703 | bytes=129 | referrer="-" | user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7" | cookie="-"date=2017-09-23 00:00:00 | ip=100.109.222.3 | method=HEAD | url=/api/foo/healthcheck | status=200 | time=0.337 | bytes=10 | referrer="-" | user-agent="-" | cookie="-"date=2017-09-23 13:32:50 | ip=40.80.31.153 | method=GET | url=/api/foo/bar?params=anything | status=200 | time=8.829 | bytes=466 | referrer="-" | user-agent="GuzzleHttp/6.2.0 curl/7.19.7 PHP/7.0.15" | cookie="-"date=2017-09-23 13:32:50 | ip=40.80.31.153 | method=GET | url=/api/foo/bar?params=everything | status=200 | time=9.962 | bytes=129 | referrer="-" | user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7" | cookie="-"date=2017-09-23 13:32:50 | ip=40.80.31.153 | method=GET | url=/api/foo/bar?params=nothing | status=200 | time=11.822 | bytes=121 | referrer="-" | user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7" | cookie="-"

不同的服务对应的日志可能不一样,本文使用示例日志的格式是:

date | ip | method | url | status | time | bytes | referrer | user-agent | cookie

注意:mac 系统和 linux 系统中的命令行为可能不同,以下命令请在 linux 系统中使用

排除特殊日志

统计日志时,我们可能不关心 HEAD 请求,或者只关心 GET 请求,这里首先需要筛选日志,可以使用 grep 命令。-v 的含义是排除匹配的文本行。

grep GET access.log # 只统计 GET 请求grep -v HEAD access.log # 不统计 HEAD 请求grep -v 'HEAD\|POST' access.log # 不统计 HEAD 和 POST 请求

查看接口耗时情况

我们可以将每行的 time 匹配出来,然后做一个排序。使用 awk 的 match 方法可以匹配正则:

awk '{ match($0, /time=([0-9]+\.[0-9]+)/, result); print result[1]}' access.log

awk 命令使用方法如下:

awk '{pattern + action}' {filenames}

我们实际上只用到了 action:match($0, /time=([0-9]+\.[0-9]+)/, result); print result[1] 这一段。

match 方法接收三个参数:需要匹配的文本、正则表达式、结果数组。$0 代表 awk 命令处理的每一行,结果数组是可选的,因为我们要拿到匹配结果所以这里传入了一个 result 数组,用来存储匹配后的结果。

注意这里的正则我没有使用 \d 来表示数字,因为 awk 指令默认使用 “EREs",不支持 \d 的表示,具体请看 linux shell 正则表达式(BREs,EREs,PREs)差异比较。

result 数组实际上和 javascript 里的结果数组很像了,所以我们打印出第二个元素,即匹配到的内容。执行完这行命令后结果如下:

9.7030.3378.8299.96211.822

当然实际上一天的日志可能是成千上万条,我们需要对日志进行排序,且只展示前 3 条。这里使用到 sort 命令。

sort 命令默认从小到大排序,且当作字符串排序。所以默认情况下使用 sort 命令之后 "11" 会排在 "8" 前面。那么需要使用 -n 指定按数字排序,-r 来按从大到小排序,然后我们查看前 3 条:

awk '{ match($0, /time=([0-9]+\.[0-9]+)/, result); print result[1]}' access.log | sort -rn | head -3

结果:

11.8229.9629.703

查看耗时最高的接口

当然我们一般不会只查看接口耗时情况,还需要把具体日志也打印出来,上面的命令就不能满足要求了。

awk 的打印默认是按空格分隔的,意思是 2017-09-23 GET 这一行如果使用 awk '{print $1}' 会打印出 "2017-09-23",类似地,$2 会打印出 GET。

根据日志特征,我们可以使用 | 来作为分隔符,这样就能打印出各个我们感兴趣的值了。因为我们想找出耗时最高的接口,那么我们把 time、date 和 url 单独找出来。

awk 的 -F 参数用来自定义分隔符。然后我们可以数一下三个部分按 | 分隔后分别是第几个:time 是第 6 个、date 是第 1 个、url 是第 4 个。

awk -F '|' '{print $6 $1 $4}' access.log

这样打出来结果为:

 time=9.703 date=2017-09-23 13:32:50 url=/api/foo/bar?params=something time=0.337 date=2017-09-23 00:00:00 url=/api/foo/healthcheck time=8.829 date=2017-09-23 13:32:50 url=/api/foo/bar?params=anything time=9.962 date=2017-09-23 13:32:50 url=/api/foo/bar?params=everything time=11.822 date=2017-09-23 13:32:50 url=/api/foo/bar?params=nothing

因为我们想按 time 来排序,而 sort 可以按列来排序,而列是按空格分隔的,我们目前第一列是 time=xxx,是不能排序的,所以这里要想办法把 time= 给去掉,因为我们很鸡贼地把耗时放在了第一列,那么其实再通过 time= 进行分隔一下就行了。

awk -F '|' '{print $6 $1 $4}' access.log | awk -F 'time=' '{print $2}'

结果:

9.703 date=2017-09-23 13:32:50 url=/api/foo/bar?params=something0.337 date=2017-09-23 00:00:00 url=/api/foo/healthcheck8.829 date=2017-09-23 13:32:50 url=/api/foo/bar?params=anything9.962 date=2017-09-23 13:32:50 url=/api/foo/bar?params=everything11.822 date=2017-09-23 13:32:50 url=/api/foo/bar?params=nothing

使用 sort 的 -k 参数可以指定要排序的列,这里是第 1 列;再结合上面的排序,就能把耗时最高的日志打印出来了:

awk -F '|' '{print $6 $1 $4}' access.log | awk -F 'time=' '{print $2}' | sort -k1nr | head -3

结果:

11.822 date=2017-09-23 13:32:50 url=/api/foo/bar?params=nothing9.962 date=2017-09-23 13:32:50 url=/api/foo/bar?params=everything9.703 date=2017-09-23 13:32:50 url=/api/foo/bar?params=something

统计请求次数最多的接口

如果需要统计哪些接口每天请求量是最多的,只需要新引入 uniq 命令。

我们已经可以通过 grep -v HEAD access.log | awk -F '|' '{print $4}' 来筛选出所有的 url,uniq 命令可以删除 相邻 的相同的行,而 -c 可以输出每行出现的次数。

所以我们先把 url 排序以让相同的 url 放在一起,然后使用 uniq -c 来统计出现的次数:

grep -v HEAD access.log | awk -F '|' '{print $4}' | sort | uniq -c

因为示例日志数量太少,我们假设日志里有多条,那么结果应该类似下面:

1 url=/api/foo/bar?params=anything19 url=/api/foo/bar?params=everything4 url=/api/foo/bar?params=nothing5 url=/api/foo/bar?params=something

接下来再 sort 即可:

grep -v HEAD access.log | awk -F '|' '{print $4}' | sort | uniq -c | sort -k1nr | head -10

感谢各位的阅读!关于“如何使用shell命令统计日志”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何使用shell命令统计日志

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何使用shell命令统计日志

这篇文章给大家分享的是有关如何使用shell命令统计日志的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言假设有一个包含下面内容的日志文件 access.log。我们以统计这个文件的日志为例。date=2017-
2023-06-09

利用shell命令统计日志的方法详解

前言 大家都知道,通过使用 shell 命令可以很方便地对日志进行统计和分析,当服务有异常的时候,需要去排查日志,那么掌握一种统计日志的技巧就是必不可少的了。 假设有一个包含下面内容的日志文件 access.log。我们以统计这个文件的日志
2022-06-04

linux系统如何查看日志命令

这篇“linux系统如何查看日志命令”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“linux系统如何查看日志命令”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢理解,接下来就让我们
2023-06-28

Shell日志分析常用命令和例子

学会用shell分析日志只要一上午!!! 很多地方分享了日志分析的shell脚本,但是基本没说每个命令符的具体含义,学习成本还是很高,在这里总结下,方便大家快速入门。 1、在Windows下的用户要使用shell命令符的话请先安装cygwi
2022-06-04

Linux系统中如何查看日志常用命令

本文将为大家详细介绍“Linux系统中如何查看日志常用命令”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“Linux系统中如何查看日志常用命令”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容如下
2023-06-28

怎么用Shell+Linux命令实现日志分析

本篇内容主要讲解“怎么用Shell+Linux命令实现日志分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Shell+Linux命令实现日志分析”吧!一、列出当天访问次数最多的IP命令:
2023-06-09

使用shell 命令怎么统计代码行数

使用shell 命令怎么统计代码行数?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。分享一个统计代码行的shell命令: find . “(” -name “.j
2023-06-09

Shell中select命令如何使用

Shell中select命令如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。select格式如下: select $var in ${list[@]}
2023-06-09

如何在Windows 7系统中使用Shell 命令

如何在Windows 7系统中使用Shell 命令?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Windows 7 Only shell:Libraries s
2023-06-14

Shell中如何使用test命令

这篇文章将为大家详细讲解有关Shell中如何使用test命令,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
2023-06-05

Shell之declare命令如何使用

在Shell中,declare命令用于声明变量的属性和类型。declare命令的语法如下:```declare [选项] 变量名[=值]```常用的选项包括:- `-a`:声明变量为数组类型- `-A`:声明变量为关联数组类型- `-i`:
2023-09-29

Shell常用服务器日志分析命令总结

目录1、查看有多少个IP访问2、查看某一个页面被访问的次数3、查看每一个IP访问了多少个页面4、将每个IP访问的页面数进行从小到大排序5、查看某一个IP访问了哪些页面6、去掉搜索引擎统计的页面7、查看2015年8月16日14时这一个小时内有
2022-06-09

如何在Linux中使用shell命令统计某列去重后的值

这篇文章将为大家详细讲解有关如何在Linux中使用shell命令统计某列去重后的值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。需求:根据MAC获取,MAC对应的硬件版本和软件版本。在根据硬
2023-06-09

如何使用shell脚本分析网站日志统计PV、404、500等数据

本篇内容介绍了“如何使用shell脚本分析网站日志统计PV、404、500等数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!下面的脚本能统
2023-06-09

如何使用Shell脚本test命令

这篇文章主要讲解了“如何使用Shell脚本test命令”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Shell脚本test命令”吧!Shell中的 test 命令用于检查某个条件是否
2023-06-09

Shell常用服务器日志分析命令有哪些

今天小编给大家分享一下Shell常用服务器日志分析命令有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、查看有多少个I
2023-07-02

使用shell怎么清理系统日志

使用shell怎么清理系统日志?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。记录一下shell日志颜色处理_COLORS=${BS_COLORS:-$(tput color
2023-06-09

如何在shell中使用source命令

这篇文章将为大家详细讲解有关如何在shell中使用source命令,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1. sh filepath会重新建立一个子shell,在子shell中执行脚
2023-06-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录