AWK 结合其他工具

《AWK 结合其他工具》


🎯 学习目标

  • 掌握 AWK 如何与 grepsortuniqcutsedxargs 等 Linux 命令配合使用
  • 能够构建完整的文本处理流水线(Pipeline)
  • 实现复杂日志分析、系统监控、数据统计等综合任务
  • 理解不同发行版(Ubuntu、CentOS、EulerOS)对命令行为的影响
  • 提升脚本灵活性和复用性,写出“一行搞定”的高效运维命令

🔑 核心重点

类别 内容
常用组合命令 grep + awkawk + sort + uniqawk + xargsawk + sed
管道机制 多级管道串联多个命令,实现链式处理
字段提取方式 cut vs awk;正则匹配 vs 字段编号
实战应用 日志过滤 → 统计 → 排序 → 报表输出;IP 封禁脚本;自动清理磁盘脚本
注意事项 不同发行版日志路径差异;权限问题影响读取;awk/gawk 兼容性

📚 详细讲解


一、为什么要把 AWK 和其他工具结合?

AWK 是强大的文本处理语言,但不是万能的。在实际运维中:

  • grep 更擅长快速筛选行内容
  • sortuniq 可以排序去重
  • 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)

五、实战案例:结合 cutsortuniq 分析用户访问路径

🧪 场景:统计最常访问的 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.html
  • sort + 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 -xbash -x script.sh 显示执行过程便于调试
strace -f command 跟踪系统调用
time command 测量执行时间
trap 设置信号捕获,防止脚本被意外中断时留下脏数据

✅ 总结

掌握 AWK 与其它 Linux 工具的协作能力,是构建高效运维脚本的关键一步。通过以下技能,你可以在 Ubuntu、CentOS、EulerOS 等不同 Linux 系统上完成复杂的日志处理和系统管理任务:

  • 构建多级管道,实现日志过滤、统计、排序一体化处理
  • 结合 grepsortuniqxargs 实现灵活的数据转换
  • 利用 system() 调用外部命令扩展功能
  • 编写可复用、可维护的命令行脚本
  • 理解不同系统的命令行为差异,写出兼容性强的脚本

继续练习真实日志和系统命令输出,你会越来越熟练地运用这些组合技巧,成为一名真正的 Linux 文本处理高手!🚀🔥🛠️

posted @ 2025-06-22 23:26  红尘过客2022  阅读(28)  评论(0)    收藏  举报