Linux怎么编写脚本快速找出访问日志中耗时最长的前10个慢接口

阿明大大_1376

阿明大大_1376

2026-10-05

511人浏览

原创

用awk提取日志耗时字段并数值降序取top10最稳:先确认字段位置,用awk切出数字(避免空格不规律或特殊字符干扰),加sort -k1,1nr和head -10,注意lc_all=c、内存限制及gzip支持。

linux怎么编写脚本快速找出访问日志中耗时最长的前10个慢接口

用 awk 提取耗时字段再排序

访问日志里耗时通常在每行末尾或固定列(比如 Nginx 的 $request_time,Apache 的 %D),直接用 awk 切出数字最稳。别信“用 cut -d' ' -fN”,空格不规律时会错位。

常见错误:把日志里 IP 或 URL 里的点、斜杠当分隔符,结果切到一半的耗时值(比如 "0.876" 变成 "0.87")。

  • 先确认耗时字段位置:用 head -1 access.log | awk '{print NF; print $0}' 看总字段数和样例
  • 如果耗时在倒数第 2 列(如 Nginx 默认格式),用 awk '{print $(NF-1), $0}' access.log 把耗时提到最前,方便排序
  • 加 -F' 指定分隔符(比如 Nginx 用空格,但有些日志用双引号包字段,这时得先用 sed 清洗)

按数值降序取 top 10,不是字典序

sort -k1 默认是字符串排序,"10.2" 会排在 "2.5" 前面——这明显不对。必须加 -n(数值)和 -r(降序)。

性能影响:大日志(GB 级)直接 sort 会吃光内存,sort -S 512M 可限制内存用量;更稳妥是先用 awk 过滤掉明显快的请求(比如 $NF ),再排。

  • 完整管道: awk '{print $(NF-1), $0}' access.log | sort -k1,1nr | head -10
  • 如果耗时字段含单位(如 "1.234s"),先用 gsub(/[^0-9.]/,"") 清洗
  • 注意时区或日志轮转导致的字段偏移——同一份日志里可能混着不同格式,建议先 grep -v "^\-" access.log 排除注释行

处理 Nginx 的 $upstream_response_time 字段

如果后端有代理(如反向代理到 Flask/Java),真正慢的是 $upstream_response_time,不是 $request_time。这个字段可能是 "-"(超时) 或 "0.001, 0.002"(多段 upstream),直接当数字排会失败。

Linux installer
Linux installer

先解析安全源,运行本地CLI安装、启动、卸载Linux桌面应用。用户请求时使用。

下载

容易踩的坑:用 awk '$NF != "-" {print $NF}' 忽略 "-" 是对的,但遇到逗号分隔的多值就得拆开。实际慢接口往往对应最大那段 upstream 耗时。

  • 提取并取最大值: awk -F', ' '{max=0; for(i=1;i max) max=$i+0; if(max>0) print max, $0}' access.log
  • 避免科学计数法干扰:某些日志里超长耗时写成 1.23e-02,awk 能直接算,但 sort -n 也认
  • 加 2>/dev/null 屏蔽 awk 对非数字字段的警告(比如空字段)

封装成可复用的 shell 函数

每次改路径、字段号太麻烦,写成函数后,slowlog access.log 12 就能指定第 12 列为耗时字段。

别硬编码 $(NF-1)——不同日志格式列数差异大,传参更灵活;也别用 source 加载一堆函数,单脚本搞定最省心。

  • 示例函数:
    slowlog() {
      local log="$1" col="${2:-$(awk '{print NF; exit}' "$log" | xargs echo -n | wc -w)}"
      awk -v c="$col" '$c ~ /^[0-9.]+([eE][+-]?[0-9]+)?$/ {print $c, $0}' "$log" 2>/dev/null | \
        sort -k1,1nr | head -10 | cut -d' ' -f2-
    }
  • 调用时加 LC_ALL=C 避免 locale 导致 sort 排序异常(比如某些中文环境把点号当分隔符)
  • 真实生产环境日志量大,别漏了 zcat 支持:zcat access.log.*.gz | slowlog /dev/stdin 12

字段位置和清洗逻辑比排序命令本身更容易出错,尤其混用多种日志格式时,先用小样本验证输出是否含完整原始行,再跑全量。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux配置 linux shell linux

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3088

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

4509

12

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.29

3709

9

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

2026.01.19

406

15

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

3830

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3293

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2433

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

5830

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

5482

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
尚观shell视频教程
尚观shell视频教程

共8课时 | 1.9万人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习