Linux awk 运维实战:网络、磁盘、内存、进程分析
Linux awk 运维实战:网络、磁盘、内存、进程分析 🧰🐧📊
学习目标 🎯
- 掌握使用
awk在 Linux 系统运维场景 中的实际应用。 - 能够使用
awk处理 网络连接、磁盘空间、内存状态、进程线程数等系统信息。 - 结合
netstat,df,free,ps,top,lsof等命令,构建自动化监控脚本。 - 理解不同发行版(Ubuntu/CentOS/EulerOS)在输出格式上的差异及兼容处理方式。
核心重点 ✅
| 类别 | 内容 |
|---|---|
| 适用场景 | 网络连接统计、磁盘使用分析、内存监控、进程/线程统计 |
| 核心技巧 | 利用管道结合 awk 提取关键字段、条件过滤、数值计算 |
| 常见命令组合 | `netstat |
| 注意事项 | 字段编号可能因发行版或参数而异;注意单位转换(如 KB/MB/GB) |
详细讲解 💡
一、网络连接分析 🌐📡
📌 场景1:查看当前所有 TCP 连接数量
netstat -ant | awk '/^tcp/ {count++} END {print "TCP 连接总数:", count}'
👀 输出示例:
TCP 连接总数: 42
📌 场景2:按 IP 统计当前建立的连接数(用于排查异常访问)
netstat -antp | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | awk '{print $2, $1}'
👀 输出示例:
192.168.1.100 15
10.0.0.5 8
📌 场景3:查看监听端口与对应服务
netstat -tulnp | awk '$6 ~ /LISTEN/ {print $4, $7}'
👀 输出示例:
*:22 sshd/1234
*:80 nginx/5678
二、磁盘空间分析 🖥️💾
📌 场景1:查看各挂载点使用率并报警(超过 90% 的标记出来)
df -h | awk 'NR==1 || $5+0 > 90'
👀 输出示例:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 10G 9.5G 512M 95% /
📌 场景2:找出使用最多的前几个目录(结合 du)
du -sh /var/* | sort -hr | head -n 10 | awk '{print $2, "=>", $1}'
👀 输出示例:
/var/log => 2.3G
/var/lib => 1.2G
三、内存与交换分区分析 💾🧮
📌 场景1:查看内存使用情况(单位 MB)
free -m | awk 'NR==2 {print "总内存:", $2 "MB"; print "已用内存:", $3 "MB"; print "空闲内存:", $4 "MB"}'
👀 输出示例:
总内存: 1983MB
已用内存: 1200MB
空闲内存: 783MB
📌 场景2:判断是否使用了 Swap 并输出警告
free -m | awk 'NR==3 && $3 > 0 {print "⚠️ 警告:Swap 已使用 " $3 "MB"}'
👀 输出示例(若使用):
⚠️ 警告:Swap 已使用 100MB
四、进程与线程分析 🚀🧱
📌 场景1:统计当前运行的进程总数
ps -e | awk 'END {print "进程总数:", NR}'
👀 输出示例:
进程总数: 152
📌 场景2:按用户统计进程数量(可用于排查资源占用)
ps -eo user --sort user | awk 'NR>1 {a[$1]++} END {for (u in a) print u, a[u]}'
👀 输出示例:
root 45
www-data 30
ubuntu 20
📌 场景3:查找 CPU 使用率最高的前 N 个进程
ps aux --sort=-%cpu | head -n 11 | awk 'NR==1 || NR>=2 {print $2, $11, $3"%"}'
👀 输出示例:
PID COMMAND %CPU
1234 /usr/bin/nginx 25.3%
5678 /usr/bin/mysql 18.2%
...
📌 场景4:统计每个进程打开的文件句柄数(适用于排查资源泄漏)
lsof | awk 'NR==1 || NR>1 {a[$1]++} END {for (i in a) print i, a[i]}' | sort -k2nr | head -n 10
👀 输出示例:
nginx 230
java 150
mysql 120
五、日志分析实战 📜🔍
📌 场景1:统计 /var/log/syslog 中每小时的日志条目数
awk '{split($0, a, ":"); key=a[2]; count[key]++} END {for (k in count) print k, count[k]}' /var/log/syslog
👀 输出示例(显示每小时出现次数):
10 123
11 456
12 789
📌 场景2:提取特定关键字(如 “error”)并统计其出现次数
grep "error" /var/log/syslog | awk '{print $5}' | sort | uniq -c | sort -nr | awk '{print $2, $1}'
👀 输出示例:
sshd 15
kernel 8
php-fpm 5
六、跨平台兼容性与注意事项 ⚠️
| 发行版 | df 默认列 |
free 默认单位 |
ps 默认输出 |
|---|---|---|---|
| Ubuntu | 文件系统、大小、已用、可用、使用率、挂载点 | KB(需加 -m 表示 MB) |
支持 --sort 参数 |
| CentOS | 同上 | 同上 | ps 不支持 --sort(建议用 sort 替代) |
| EulerOS | 同上 | 同上 | 通常更接近 CentOS 行为 |
📌 小贴士:
- 使用
NR==1来跳过标题行。 - 使用
$NF取最后一列,避免字段变化导致错误。 - 单位统一成 KB/MB 时,可先乘以 1024 或除以 1024 转换。
- 使用
LC_NUMERIC=C防止区域设置影响数字解析。
七、综合实战:写一个简单的系统监控脚本 🧪
📝 脚本名:sys_monitor.sh
#!/bin/bash
echo "=== 系统监控报告 ==="
echo
# 磁盘使用
echo "== 磁盘使用情况 =="
df -h | awk 'NR==1 || $5+0 > 90'
echo
# 内存使用
echo "== 内存使用情况 =="
free -m | awk 'NR==2 {print "总内存:", $2 "MB"; print "已用内存:", $3 "MB"; print "空闲内存:", $4 "MB"}'
echo
# 进程数量
echo "== 进程统计 =="
ps -e | awk 'END {print "进程总数:", NR}'
echo
# 网络连接数
echo "== 网络连接统计 =="
netstat -ant | awk '/^tcp/ {count++} END {print "TCP 连接总数:", count}'
echo
# Swap 使用
echo "== Swap 使用 =="
free -m | awk 'NR==3 && $3 > 0 {print "⚠️ 警告:Swap 已使用 " $3 "MB"}'
echo "===================="
✅ 使用方法:
chmod +x sys_monitor.sh
./sys_monitor.sh
总结 📋
awk 是 Linux 系统运维中不可或缺的文本处理利器。它不仅能快速提取和分析日志数据,还能配合各种系统命令实现自动化的资源监控与问题诊断。
通过本章学习,你应能掌握以下技能:
- 使用
awk分析网络连接、磁盘、内存、进程等系统资源; - 构建实用的监控脚本;
- 处理不同发行版输出格式差异;
- 应对实际运维中的复杂文本处理任务。
建议继续深入学习 awk 的函数、数组、模式匹配等高级特性,并结合 cron 定时任务实现定期巡检自动化。

浙公网安备 33010602011771号