别再手动算列:awk 的四个日常用法
日志里想统计每个 IP 出现了几次、CSV 里想取第 3 列求和、配置文件里想批量提取某个字段,这些活如果靠眼睛数列、靠编辑器一行行改,又慢又容易错。awk 是 Linux 自带的文本处理工具,专门按列处理,学会四个用法,日常算列不用再手动数。
1. 取列:先分清分隔符
awk 默认按空格和 Tab 分列,$1 是第一列,$2 是第二列,$0 是整行。想取 ps 输出里的进程名和内存:
ps aux | awk '{print $2, $4, $11}'
这条只输出 PID、内存占比和命令三列。如果是逗号分隔的 CSV,要先用 -F 指定分隔符:
awk -F, '{print $1, $3}' data.csv
先确认分隔符再取列,是用 awk 的第一步,分隔符错了,后面全错。
2. 按条件过滤:只看符合条件的行
awk 可以在取列之前先过滤。只看状态码是 500 的日志行,并输出时间和 IP:
awk '$9 == 500 {print $1, $4}' access.log
$9 是第 9 列,== 是等于。想看某个 IP 的所有请求:
awk '$1 == "192.168.1.10"' access.log
条件写在花括号前面,符合条件的行才执行后面的动作。先过滤再处理,输出立刻干净很多。
3. 统计求和:不用再导进表格
awk 自带变量,可以边读边算。统计每个 IP 出现了几次:
awk '{count[$1]++} END {for (ip in count) print ip, count[ip]}' access.log
count[$1]++ 是按 IP 计数,END 是在读完所有行之后执行,循环打印结果。求某一列的总和也一样:
awk '{sum += $5} END {print sum}' data.txt
日志分析、账单对数这类“先分组、再汇总”的活,一条 awk 就能出结果,不用先导进 Excel。
4. 格式化输出:结果直接能看
awk 的 printf 可以控制输出格式,对齐列、保留小数都行。把内存占用按 MB 输出并保留一位小数:
ps aux | awk 'NR>1 {printf "%-10s %8.1f MB\n", $11, $6/1024}'
NR>1 是跳过标题行,%-10s 左对齐占 10 字符,%8.1f 保留一位小数。输出整齐了,贴到汇报里、发给别人看都方便。
小结
取列先定分隔符、按条件先过滤、统计用变量累加、输出用 printf 对齐。awk 的语法一开始看着有点怪,但这四个用法都是“先想清楚要什么列、什么条件、怎么汇总”,想清楚了再写,基本一次就能对。列数多了、文件大了,awk 比手动翻快得多。
- 点赞
- 收藏
- 关注作者
评论(0)