要找出耗时最长的前10个请求,需先用awk提取耗时字段(如$10或匹配rt=、ms等模式),转为纯数字后与整行日志拼接,再通过sort -nr降序排序,最后用head -10取前10行并用cut去除首列耗时值。

要从日志中用 awk 找出耗时最长的前 10 个请求,关键是先识别出“耗时字段”,再按数值降序排序,最后取前 10 行。常见于 Nginx、Apache 或自定义应用日志(如包含响应时间、毫秒数等字段)。
确认耗时字段的位置
大多数日志中耗时字段是数字,比如 Nginx 的 $request_time(单位秒,带小数),或应用日志里的 duration=123ms、time_ms:456 等。你需要先看几行日志,确定它在每行中的位置或匹配模式:
- 如果是空格/制表符分隔且固定列(如第 8 列是耗时):
awk '{print $8, $0}' access.log - 如果字段带标签(如
rt=245.67):awk -F'rt=' '{split($2,a,"[[:space:]]"); print a[1], $0}' access.log - 如果含单位(如
234ms):awk '{match($0, /([0-9]+)ms/); print substr($0,RSTART,RLENGTH-2), $0}' access.log
提取并按耗时倒序排序
把耗时值提取出来作为第一列,整行日志放后面,然后用 sort -nr 按数值逆序排(-n 数值排序,-r 降序):
- 假设第 7 列是秒级耗时(如
0.842):awk '{print $7, $0}' access.log | sort -nr | head -10 - 若需去掉首列耗时只输出原始日志:
awk '{print $7, $0}' access.log | sort -nr | head -10 | cut -d' ' -f2-
处理浮点数和单位统一(关键细节)
耗时字段常为小数(如 0.032 秒)或整数毫秒(如 <code>32)。sort -n 能正确比较浮点数,但要注意避免字符串误判:
- 确保提取的是纯数字:用
0+$7强转(awk '{print 0+$7, $0}'),可过滤掉非数字导致的排序错乱 - 若单位混用(部分 ms、部分 s),先统一换算:比如把所有 ms 转成秒:
awk '/ms$/ {sub(/ms$/,"",$7); print $7/1000, $0; next} {print $7, $0}'
一行完整命令示例(Nginx 日志典型场景)
Nginx 默认日志格式中 $request_time 是第 10 列(以空格分隔),常用命令如下:
awk '{if ($10 ~ /^[0-9.]+$/) print $10, $0}' access.log | sort -nr | head -10 | cut -d' ' -f2-
说明:if ($10 ~ /^[0-9.]+$/ 过滤掉非数字的第 10 列(防 header 错位),cut -d' ' -f2- 去掉开头的耗时值,只保留原始日志行。











