AWK 脚本化与自动化
《AWK 脚本化与自动化》
🎯 学习目标
- 掌握如何将 AWK 命令封装为可复用的脚本文件
- 理解如何传递参数、处理命令行输入、输出到文件等基本脚本能力
- 实现 AWK 与 Shell 脚本结合,构建完整的自动化运维流程
- 学会使用函数、状态机、条件判断等结构编写复杂逻辑
- 在 Ubuntu 系统上进行实际部署测试,并理解不同发行版(如 CentOS、EulerOS)的兼容性差异
🔑 核心重点
| 类别 | 内容 |
|---|---|
| 脚本形式 | 单行命令 vs 多行脚本;BEGIN{} 和 END{} 的使用 |
| 参数传递 | -v var=value;ARGV 数组;标准输入传参 |
| 函数定义 | 自定义函数实现模块化代码 |
| 流程控制 | if/else、for、while、switch 模拟 |
| 实战应用 | 日志统计、自动封禁 IP、资源监控、定时任务集成 |
| 注意事项 | 不同系统日志路径差异;权限问题影响读取;awk/gawk 兼容性 |
📚 详细讲解
一、为什么要把 AWK 写成脚本?
虽然我们经常在命令行中写“一行搞定”的 AWK 命令,但当:
- 需要处理多步逻辑
- 有多个条件分支
- 需要复用或调试
- 要配合
cron或其他自动化工具运行
这时,将 AWK 封装为脚本就显得尤为重要。它可以提升可读性、可维护性,并且便于版本管理和团队协作。
二、从命令行到脚本:三种写法对比
✅ 1. 单行命令(适合简单操作)
awk '{ip[$1]++} END {for (k in ip) print ip[k], k}' access.log
✅ 2. 使用 shebang 的脚本方式(推荐)
创建一个文件 count_ip.awk:
#!/usr/bin/awk -f
{
ip[$1]++
}
END {
for (k in ip)
print ip[k], k
}
然后赋予执行权限并运行:
chmod +x count_ip.awk
./count_ip.awk access.log
✅ 3. Shell 调用 AWK 脚本(更灵活)
创建 analyze.sh:
#!/bin/bash
LOG_FILE="$1"
awk '
{
ip[$1]++
}
END {
for (k in ip)
print ip[k], k
}' "$LOG_FILE"
运行方式:
chmod +x analyze.sh
./analyze.sh access.log
📌 优势:
- 可以做参数检查、错误处理
- 更容易和
cron、systemd等集成
三、实战案例:带参数的 AWK 脚本 —— 指定分析时间段
🧪 场景:只分析某一天的日志
# analyze_day.awk
BEGIN {
target_date = ARGV[1]
delete ARGV[1]
}
$0 ~ target_date
📌 使用方法:
awk -f analyze_day.awk "22/Jun" /var/log/nginx/access.log
✅ 技巧说明:
ARGV[1]获取第一个参数(日期)delete ARGV[1]防止 AWK 把它当作文件名处理$0 ~ target_date表示只匹配包含该日期的行
四、实战案例:自动封禁异常登录的 IP(结合 Shell)
🧪 场景:分析 /var/log/auth.log,自动封禁尝试超过 5 次失败登录的 IP
# block_ssh_attackers.sh
#!/bin/bash
THRESHOLD=5
awk -v threshold="$THRESHOLD" '
/Failed password/ {
ip[$(NF-3)]++
}
END {
for (i in ip)
if (ip[i] > threshold)
print i
}' /var/log/auth.log | while read ip; do
echo "[+] 封禁 IP: $ip"
sudo iptables -A INPUT -s "$ip" -j DROP
done
📌 输出示例:
[+] 封禁 IP: 192.168.1.100
[+] 封禁 IP: 192.168.1.102
⚠️ 注意事项:
- Ubuntu 使用
/var/log/auth.log,CentOS/EulerOS 使用/var/log/secure - 需要 root 权限运行此脚本(建议加
sudo) - 生产环境不建议直接操作 iptables,可用
fail2ban替代
五、实战案例:定义函数实现模块化脚本
🧪 场景:统一格式化时间戳
# format_time.awk
function format_time(log_time, t) {
gsub(/\[|\+.*$/, "", log_time);
split(log_time, t, ":");
return t[2] ":" t[3] ":" t[4];
}
{
time = format_time($4);
print time, $1, $7;
}
📌 使用方式:
awk -f format_time.awk access.log
📌 输出示例:
12:34:56 192.168.1.100 /index.html
✅ 应用价值:
- 函数可以复用,减少重复代码
- 提高脚本可读性和可维护性
六、实战案例:结合 cron 定时运行 AWK 脚本
🧪 场景:每天凌晨清理一次日志中的空行并归档
编辑 crontab:
crontab -e
添加以下内容:
0 0 * * * /usr/bin/awk 'length > 0' /var/log/syslog > /var/log/syslog.cleaned && mv /var/log/syslog.cleaned /var/log/syslog
📌 功能说明:
length > 0删除空行>清空原文件后重写- 可用于压缩日志、定期清理等场景
七、不同 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 |
| 默认 shell | bash | bash | bash |
📌 小贴士:
- 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 系统上写出健壮、可维护、可扩展的脚本:
- 将 AWK 命令封装为脚本文件,支持参数传递和复用
- 结合 Shell 编写完整自动化流程
- 使用函数实现模块化代码
- 利用
BEGIN{}和END{}控制执行阶段 - 与
cron、iptables、find等工具集成实现定时任务和安全策略
继续练习真实日志和系统命令输出,你会越来越熟练地运用这些脚本技巧,成为一名真正的 Linux 自动化高手!🚀🔥🛠️

浙公网安备 33010602011771号