AWK 结合其他工具
《AWK 结合其他工具》
🎯 学习目标
- 掌握 AWK 如何与
grep、sort、uniq、cut、sed、xargs等 Linux 命令配合使用 - 能够构建完整的文本处理流水线(Pipeline)
- 实现复杂日志分析、系统监控、数据统计等综合任务
- 理解不同发行版(Ubuntu、CentOS、EulerOS)对命令行为的影响
- 提升脚本灵活性和复用性,写出“一行搞定”的高效运维命令
🔑 核心重点
| 类别 | 内容 |
|---|---|
| 常用组合命令 | grep + awk、awk + sort + uniq、awk + xargs、awk + sed |
| 管道机制 | 多级管道串联多个命令,实现链式处理 |
| 字段提取方式 | cut vs awk;正则匹配 vs 字段编号 |
| 实战应用 | 日志过滤 → 统计 → 排序 → 报表输出;IP 封禁脚本;自动清理磁盘脚本 |
| 注意事项 | 不同发行版日志路径差异;权限问题影响读取;awk/gawk 兼容性 |
📚 详细讲解
一、为什么要把 AWK 和其他工具结合?
AWK 是强大的文本处理语言,但不是万能的。在实际运维中:
grep更擅长快速筛选行内容sort和uniq可以排序去重xargs可将输出转为命令参数cut适合简单字段提取sed擅长字符串替换和编辑
通过组合这些工具,你可以构建出强大且高效的文本处理流水线。
二、实战案例:日志分析三步走 —— 过滤 → 统计 → 排序
🧪 场景:找出访问最多的 IP 并按访问次数排序
# 方法1:纯 AWK
awk '{ip[$1]++} END {for (k in ip) print ip[k], k}' /var/log/nginx/access.log | sort -nr | head -n 10
# 方法2:结合 grep 过滤特定时间范围
grep "22/Jun" /var/log/nginx/access.log | awk '{ip[$1]++} END {for (k in ip) print ip[k], k}' | sort -nr | head -n 10
📌 输出示例:
150 192.168.1.100
120 192.168.1.101
✅ 技巧说明:
awk负责统计每个 IP 的访问次数sort -nr按数字降序排列head -n 10只显示前 10 名
三、实战案例:从日志中提取 IP 并封禁高频失败登录者(结合 iptables)
🧪 场景:找出 SSH 登录失败超过 10 次的 IP,并添加到防火墙规则
grep "Failed password" /var/log/auth.log | awk '{print $NF}' | sort | uniq -c | awk '$1 > 10 {system("iptables -A INPUT -s " $2 " -j DROP")}'
📌 示例解释:
grep:过滤出失败登录记录awk:提取最后一个字段(IP)sort + uniq -c:统计每个 IP 出现次数- 第二个
awk:判断次数是否大于 10,是则调用system()执行iptables命令
⚠️ 注意事项:
- Ubuntu 使用
/var/log/auth.log,CentOS/EulerOS 使用/var/log/secure - 需要 root 权限运行此命令(建议加
sudo) - 生产环境不建议直接操作 iptables,可用
fail2ban替代
四、实战案例:结合 xargs 删除指定目录下的大文件
🧪 场景:查找并删除 /tmp 下大于 100MB 的文件
find /tmp -type f -size +100M -exec echo {} \; | xargs -I {} rm -f {}
📌 或者更安全的方式(先列出再删除):
find /tmp -type f -size +100M | awk '{print "rm -f " $0}' | bash
✅ 应用价值:
- 自动化清理临时文件
- 防止磁盘爆满导致服务异常
- 可用于定时任务(crontab)
五、实战案例:结合 cut、sort、uniq 分析用户访问路径
🧪 场景:统计最常访问的 URL 路径(Nginx/Apache 日志)
cut -d '"' -f2 /var/log/nginx/access.log | cut -d ' ' -f2 | sort | uniq -c | sort -nr | head -n 10
📌 解释:
cut -d '"' -f2:提取请求行(如GET /index.html HTTP/1.1)cut -d ' ' -f2:提取路径部分/index.htmlsort + uniq -c:统计访问次数sort -nr:按访问次数排序
六、实战案例:结合 sed 清洗日志格式(标准化输出)
🧪 场景:去除日志中的 ANSI 转义码或多余空格
sed 's/\x1b$$[0-9;]*m//g' /var/log/syslog | awk '/error/ {print $0}' | tee error_cleaned.log
📌 解释:
sed:去除颜色代码(ANSI Escape Sequence)awk:提取包含error的行tee:同时输出到终端和文件
✅ 应用价值:
- 清理彩色日志以便后续处理
- 提高日志可读性和一致性
七、实战案例:结合 top 监控资源占用最高的进程(模拟 top-n)
🧪 场景:获取当前 CPU 占用最高的前 5 个进程
top -b -n 1 | awk '/Cpu/ {next} /Mem/ {next} /Swap/ {next} NR > 7 {print $1, $9, $12}' | head -n 5
📌 输出示例:
PID %CPU COMMAND
1234 25.3 python
5678 12.1 nginx
...
✅ 应用价值:
- 快速识别资源瓶颈
- 可用于自动化诊断脚本
八、不同 Linux 发行版注意事项(Ubuntu vs CentOS vs EulerOS)
| 功能 | Ubuntu | CentOS | EulerOS |
|---|---|---|---|
| 默认 awk | gawk | gawk | gawk |
支持 PROCINFO["sorted_in"] |
✅(gawk >= 4.0) | ✅ | ✅ |
| 认证日志路径 | /var/log/auth.log |
/var/log/secure |
同 CentOS |
| 查看日志权限 | sudo 查看 | 需 sudo | 需 sudo |
| 安装邮件工具 | apt install mailutils |
yum install mailx |
yum install mailx |
📌 小贴士:
- 在 CentOS/EulerOS 上查看
/var/log/secure需要管理员权限,建议使用sudo awk ... - 不同系统的日志格式会影响字段提取逻辑,请先观察几行日志结构再写脚本
九、调试与优化建议
| 技巧 | 说明 |
|---|---|
| `echo "test" | awk '...'` |
| `head -n 5 file | awk '...'` |
set -x 或 bash -x script.sh |
显示执行过程便于调试 |
strace -f command |
跟踪系统调用 |
time command |
测量执行时间 |
trap |
设置信号捕获,防止脚本被意外中断时留下脏数据 |
✅ 总结
掌握 AWK 与其它 Linux 工具的协作能力,是构建高效运维脚本的关键一步。通过以下技能,你可以在 Ubuntu、CentOS、EulerOS 等不同 Linux 系统上完成复杂的日志处理和系统管理任务:
- 构建多级管道,实现日志过滤、统计、排序一体化处理
- 结合
grep、sort、uniq、xargs实现灵活的数据转换 - 利用
system()调用外部命令扩展功能 - 编写可复用、可维护的命令行脚本
- 理解不同系统的命令行为差异,写出兼容性强的脚本
继续练习真实日志和系统命令输出,你会越来越熟练地运用这些组合技巧,成为一名真正的 Linux 文本处理高手!🚀🔥🛠️

浙公网安备 33010602011771号