AWK 脚本化与自动化

《AWK 脚本化与自动化》


🎯 学习目标

  • 掌握如何将 AWK 命令封装为可复用的脚本文件
  • 理解如何传递参数、处理命令行输入、输出到文件等基本脚本能力
  • 实现 AWK 与 Shell 脚本结合,构建完整的自动化运维流程
  • 学会使用函数、状态机、条件判断等结构编写复杂逻辑
  • 在 Ubuntu 系统上进行实际部署测试,并理解不同发行版(如 CentOS、EulerOS)的兼容性差异

🔑 核心重点

类别 内容
脚本形式 单行命令 vs 多行脚本;BEGIN{}END{} 的使用
参数传递 -v var=value;ARGV 数组;标准输入传参
函数定义 自定义函数实现模块化代码
流程控制 if/elseforwhileswitch 模拟
实战应用 日志统计、自动封禁 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

📌 优势:

  • 可以做参数检查、错误处理
  • 更容易和 cronsystemd 等集成

三、实战案例:带参数的 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 -xbash -x script.sh 显示执行过程便于调试
strace -f command 跟踪系统调用
time command 测量执行时间
trap 设置信号捕获,防止脚本被意外中断时留下脏数据

✅ 总结

掌握 AWK 的脚本化与自动化能力,是迈向高级 Linux 运维工程师的关键一步。通过以下技能,你可以在 Ubuntu、CentOS、EulerOS 等不同 Linux 系统上写出健壮、可维护、可扩展的脚本:

  • 将 AWK 命令封装为脚本文件,支持参数传递和复用
  • 结合 Shell 编写完整自动化流程
  • 使用函数实现模块化代码
  • 利用 BEGIN{}END{} 控制执行阶段
  • croniptablesfind 等工具集成实现定时任务和安全策略

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

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