Linux 常用分析命令完全指南
目录
一、文本处理命令
1.1 awk 命令详解
awk 是强大的文本处理工具,特别适合处理结构化日志数据。
基本语法
1 | awk -F "分隔符" '{处理逻辑}' 文件名 |
常用示例
示例 1:提取字段并排序
1 | # 以 "back_" 为分隔符,提取第 2 列,按数字降序排列 |
示例 2:提取字段并保存到文件
1 | # 将结果输出到 out.txt 文件 |
参数说明:
-F "back_":指定分隔符为back_{print $2}:打印第 2 个字段sort -nr:按数字降序排序(n=numeric, r=reverse)more:分页显示> out.txt:重定向到文件
1.2 grep 命令详解
grep 用于在文件中搜索匹配的文本行。
基本语法
1 | grep [选项] "搜索模式" 文件名 |
常用选项
| 选项 | 说明 | 示例 |
|---|---|---|
-v |
反向匹配(排除) | grep -v "error" log.txt |
-i |
忽略大小写 | grep -i "warning" log.txt |
-n |
显示行号 | grep -n "error" log.txt |
-c |
统计匹配行数 | grep -c "error" log.txt |
-r |
递归搜索目录 | grep -r "error" /var/log/ |
1.3 组合使用示例
场景 1:日志统计分析
需求:从日志中提取响应时间,计算总和和平均值
1 | # 排除包含 1540 的行,筛选包含 back_ 的行,计算平均值 |
执行流程:
grep -v 1540:排除包含 “1540” 的行grep back_:筛选包含 “back_” 的行awk -F "back_":以 “back_” 为分隔符if ($2 < 0) { $2 = 100; }:如果值小于 0,替换为 100(异常值处理)sum += $2:累加第 2 列的值END { ... }:处理完所有行后,输出总和和平均值
场景 2:多文件对比分析
1 | # 分析 159fs.log 文件 |
场景 3:从文件读取数据分析
1 | # 从 out.txt 文件中读取并分析 |
注意事项:
- ✅ 第一个
grep缺少搜索模式,应改为grep "pattern" out.txt - ✅ 建议使用
cat out.txt | grep back_或直接grep back_ out.txt
二、ElasticSearch 运维命令
2.1 集群健康检查
方法一:使用 _cat API(简洁输出)
1 | curl --user elastic:changeme -XGET 'localhost:9200/_cat/health?v&pretty' |
输出示例:
1 | epoc timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent |
状态说明:
- 🟢 green:所有主分片和副本分片都正常
- 🟡 yellow:所有主分片正常,但部分副本分片未分配
- 🔴 red:部分主分片未分配,数据不完整
方法二:使用 _cluster API(详细 JSON 输出)
1 | curl -XGET "http://localhost:9200/_cluster/health?pretty=true" |
输出示例:
1 | { |
2.2 认证访问
如果 ES 集群启用了安全认证,需要在请求中携带用户名和密码:
1 | # 方式 1:URL 中包含用户信息 |
安全建议:
- ✅ 避免在命令行中明文输入密码(会记录到 bash_history)
- ✅ 使用环境变量或配置文件存储凭证
- ✅ 生产环境建议使用 HTTPS + 证书认证
其他常用 ES 命令
1 | # 查看节点信息 |
三、Java JVM 诊断命令
3.1 GC 监控
使用 jstat 监控 JVM 垃圾回收情况:
1 | # 查看 GC 统计信息(每 1000ms 刷新一次) |
输出示例:
1 | S0 S1 E O M CCS YGC YGCT FGC FGCT GCT |
字段说明:
| 字段 | 含义 | 说明 |
|---|---|---|
| S0/S1 | Survivor 区使用率 | 年轻代存活区 |
| E | Eden 区使用率 | 年轻代对象分配区 |
| O | Old 区使用率 | 老年代使用率 |
| M | Metaspace 使用率 | 元空间使用率(JDK 8+) |
| CCS | Compressed Class Space | 压缩类空间使用率 |
| YGC | Young GC 次数 | 年轻代 GC 次数 |
| YGCT | Young GC 总耗时 | 年轻代 GC 累计时间(秒) |
| FGC | Full GC 次数 | 全量 GC 次数 |
| FGCT | Full GC 总耗时 | 全量 GC 累计时间(秒) |
| GCT | GC 总耗时 | 所有 GC 累计时间(秒) |
告警阈值:
- ⚠️ Old 区使用率 > 80%:可能存在内存泄漏
- ⚠️ FGC 频率 > 1 次/分钟:需要优化 GC 参数
- ⚠️ GCT/YGC > 10%:GC 开销过大
3.2 线程堆栈分析
使用 jstack 导出线程堆栈信息:
1 | # 导出线程堆栈到文件 |
常见线程状态:
| 状态 | 说明 | 排查方向 |
|---|---|---|
| RUNNABLE | 运行中 | CPU 高时重点分析 |
| BLOCKED | 阻塞等待锁 | 检查锁竞争 |
| WAITING | 等待通知 | 检查条件是否满足 |
| TIMED_WAITING | 超时等待 | 检查 sleep/wait 时间 |
| DEADLOCK | 死锁 | 立即处理 |
分析技巧:
1 | # 查找 CPU 占用高的线程 |
3.3 类加载统计
使用 jcmd 查看类加载情况:
1 | # 查看类直方图(按实例数量排序) |
输出示例:
1 | num #instances #bytes class name |
分析要点:
- ✅ 关注实例数量异常的类
- ✅ 检查是否有内存泄漏(实例数持续增长)
- ✅ 对比不同时间点的快照,找出增长趋势
替代方案(适用于 JDK 8+):
1 | # 使用 jmap(JDK 8 及以下) |
3.4 日志分析
从应用日志中提取性能数据:
1 | # 提取耗时超过 1000 毫秒的请求 |
执行流程:
cat catalina.out:读取日志文件grep "信息结束耗时":筛选包含关键字的行awk -F'信息结束耗时:' '{print $2}':提取耗时数值部分awk -F'毫秒' '$1 > 1000 {print $1}':过滤出大于 1000 毫秒的记录more:分页显示
优化版本(带统计功能):
1 | # 统计慢请求数量和平均耗时 |
实时监控版本:
1 | # 实时监控慢请求(每 5 秒刷新) |
四、最佳实践
4.1 命令使用建议
✅ 推荐做法:
日志分析前备份:重要日志先备份再分析
1
cp catalina.out catalina.out.bak
大文件使用流式处理:避免一次性加载到内存
1
2
3
4
5# ✅ 好:流式处理
tail -f log.txt | grep pattern
# ❌ 不好:大文件全部加载
cat huge_log.txt | grep pattern组合命令使用管道:提高处理效率
1
grep pattern log.txt | awk '{print $2}' | sort -nr | head -10
定期清理历史数据:避免磁盘空间不足
1
2# 删除 7 天前的日志
find /var/log -name "*.log" -mtime +7 -delete
❌ 避免做法:
- ❌ 不要在高峰期执行
jmap -dump(会导致 STW) - ❌ 不要在生产环境频繁执行
jstack(影响性能) - ❌ 不要在命令行中明文输入密码
- ❌ 不要忽略 GC 告警信号
4.2 性能分析流程
Java 应用性能问题排查步骤
1 | 发现问题(RT 飙升/CPU 高) |
常用诊断命令速查表
| 问题类型 | 首选命令 | 辅助命令 |
|---|---|---|
| CPU 高 | top -Hp |
jstack, pidstat |
| 内存泄漏 | jstat -gcutil |
jmap, MAT |
| 线程阻塞 | jstack |
top, vmstat |
| GC 频繁 | jstat -gcutil |
jcmd GC.heap_info |
| 死锁检测 | jstack -l |
jcmd Thread.print |
| 日志分析 | grep + awk |
tail -f, less |