Linux awk 运维实战:网络、磁盘、内存、进程分析

Linux awk 运维实战:网络、磁盘、内存、进程分析 🧰🐧📊


学习目标 🎯

  • 掌握使用 awkLinux 系统运维场景 中的实际应用。
  • 能够使用 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 定时任务实现定期巡检自动化。

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