Linux下使用AWK提取日志中指定列的数据 常用文本分析案例【详解】

云墨大大_4643

云墨大大_4643

2026-05-04

522人浏览

原创

结论:用 awk 提取日志指定列,关键不是“怎么写”,而是“分隔符对不对”“字段有没有越界”“条件和打印是否绑在同一规则里”。错一个,就空、乱、漏。

linux下使用awk提取日志中指定列的数据 常用文本分析案例【详解】

直接说结论:用 awk 提取日志指定列,关键不是“怎么写”,而是“分隔符对不对”“字段有没有越界”“条件和打印是否绑在同一规则里”。错一个,就空、乱、漏。

为什么 awk '{print $5}' access.log 输出全是空?

因为日志不是按空格整齐切分的。比如 Nginx 默认日志:

192.168.1.1 - - [24/Apr/2026:08:00:01 +0000] "GET /api/v1/users HTTP/1.1" 200 1234 "-" "curl/7.68.0"

这里 $5 是 [24/Apr/2026:08:00:01(左括号开头),$6 是 +0000],根本不是你想要的时间戳主体。

  • 先用 cat -A access.log | head -1 看真实分隔符:空格、中括号、引号都可能是“视觉分隔符”,但 awk 只认 FS 指定的字符
  • 用 awk '{print NF, $0}' access.log | head -5 检查每行字段数是否稳定;如果 NF 波动大,说明有字段含空格(如 user-agent)
  • 别硬猜,用正则分隔更稳:awk -F'\[|\]|" "' '{print $2, $4}' access.log —— 这里用 -F'\[|\]|" "' 把中括号和引号空格都当分隔符,$2 就是时间字符串,$4 是请求行

提取带空格字段(如 User-Agent)该用 match() 还是 substr()?

都不如用 FPAT(GNU awk 特性)。默认 FS 切分会导致 user-agent 被截断,而 FPAT 定义“什么是字段”,而不是“用什么切”:

Linux Ai Server
Linux Ai Server

Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。

下载
awk 'BEGIN{FPAT="([^[:space:]"()]*)|("[^"]+")"} {print $NF}' access.log

这段把带引号的整个 UA 当作一个字段("curl/7.68.0"),$NF 就是它。注意:FPAT 在 macOS 的 awk(BSD 版)不支持,得换 gawk。

  • 如果只能用 POSIX awk,改用 match() 定位起始位置:match($0, /"([^"]+)"/) {print substr($0, RSTART+1, RLENGTH-2)}
  • substr() 本身不解析结构,纯靠偏移;一旦日志格式微调(比如多加一个字段),偏移就全错
  • 永远优先验证:echo '..."Mozilla/5.0..."...' | awk '...' | head -1,别等跑完百万行才发现字段偏了

想按状态码筛选再取响应体大小,为什么管道写法会丢数据?

写成 awk '$9 == 200' access.log | awk '{print $10}' 看似合理,但第二道 awk 会重新用空格切分——而原始第 10 字段可能含空格(比如被压缩的响应头),导致 $10 实际是错的。

  • 必须在单条 awk 中完成:awk '$9 == 200 {print $10}' access.log
  • 数字比较不用引号,字符串要:$9 == 200 对,$6 ~ /^GET/ 对,但 $9 == "200" 在某些老版本会类型转换失败
  • 如果字段是 -(表示缺失),$10 == "-" 才能匹配,不能写成 !$10(空字符串和 - 不同)
  • 性能上,单次扫描比两次管道快 3–5 倍,尤其 SSD 都救不了重复读盘

输出多列时字段粘连或顺序错乱?

print $2 $5 会连在一起(如 userGET),print $2, $5 才用空格分隔。但这空格不是原始日志里的,是 OFS 控制的,默认单空格。

  • 要保留原始缩进或对齐,用 printf:awk '{printf "%-15s %s ", $1, $9}' access.log
  • 导出 CSV?显式设 OFS:awk -F' ' 'BEGIN{OFS=","} $9==200 {print $1,$4,$9,$10}' access.log
  • 别省略 BEGIN{OFS=...} —— 放在 action 里(如 {OFS=","; print ...})无效,OFS 必须在记录处理前生效
  • 最易忽略的一点:print 自动换行,printf 不自动;漏了 ,所有输出会挤在一行

真正难的不是语法,是看懂日志的“物理结构”:哪些字符是分隔符,哪些是字段内容,哪些是干扰噪声。每次换一种日志格式,都得重走一遍 cat -A → NF 检查 → FPAT 或正则分隔 → 单规则条件+打印 这四步,跳不过。

相关文章

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

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

下载

相关标签:

linux

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

相关专题

更多
磁盘配额是什么
磁盘配额是什么

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

2023.06.21

4110

4

如何安装LINUX
如何安装LINUX

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

2023.06.29

3493

10

linux find
linux find

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

2023.06.30

2713

5

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

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

2023.07.05

6590

7

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

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

2023.07.06

6242

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

3613

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

3105

4

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

2023.07.25

3339

6

linux查找文件命令
linux查找文件命令

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.31

297

3

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

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

共0课时 | 0人学习

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

共0课时 | 0人学习