170412-常用分析命令汇总

Linux 常用分析命令完全指南

目录


一、文本处理命令

1.1 awk 命令详解

awk 是强大的文本处理工具,特别适合处理结构化日志数据。

基本语法

1
awk -F "分隔符" '{处理逻辑}' 文件名

常用示例

示例 1:提取字段并排序
1
2
# 以 "back_" 为分隔符,提取第 2 列,按数字降序排列
awk -F "back_" '{print $2}' 159hq.log | sort -nr | more
示例 2:提取字段并保存到文件
1
2
# 将结果输出到 out.txt 文件
awk -F "back_" '{print $2}' 159hq.log | sort -nr > 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
2
3
4
5
6
7
8
# 排除包含 1540 的行,筛选包含 back_ 的行,计算平均值
grep -v 1540 159hq.log | grep back_ | awk -F "back_" '{
if ($2 < 0) { $2 = 100; }
sum += $2;
} END {
print "sum = " sum;
print "average = " sum/NR
}'

执行流程

  1. grep -v 1540:排除包含 “1540” 的行
  2. grep back_:筛选包含 “back_” 的行
  3. awk -F "back_":以 “back_” 为分隔符
  4. if ($2 < 0) { $2 = 100; }:如果值小于 0,替换为 100(异常值处理)
  5. sum += $2:累加第 2 列的值
  6. END { ... }:处理完所有行后,输出总和和平均值

场景 2:多文件对比分析

1
2
3
4
5
6
7
8
# 分析 159fs.log 文件
grep -v 1540 159fs.log | grep back_ | awk -F "back_" '{
if ($2 < 0) { $2 = 100; }
sum += $2;
} END {
print "sum = " sum;
print "average = " sum/NR
}'

场景 3:从文件读取数据分析

1
2
3
4
5
6
7
8
# 从 out.txt 文件中读取并分析
grep back_ out.txt | awk -F "back_" '{
if ($2 < 0) { $2 = 100; }
sum += $2;
} END {
print "sum = " sum;
print "average = " sum/NR
}'

注意事项

  • ✅ 第一个 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
2
epoc      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1234567890 12:00:00 my-cluster green 3 3 30 15 0 0 0 0 - 100.0%

状态说明

  • 🟢 green:所有主分片和副本分片都正常
  • 🟡 yellow:所有主分片正常,但部分副本分片未分配
  • 🔴 red:部分主分片未分配,数据不完整

方法二:使用 _cluster API(详细 JSON 输出)

1
curl -XGET "http://localhost:9200/_cluster/health?pretty=true"

输出示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"cluster_name": "my-cluster",
"status": "green",
"timed_out": false,
"number_of_nodes": 3,
"number_of_data_nodes": 3,
"active_primary_shards": 15,
"active_shards": 30,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 100.0
}

2.2 认证访问

如果 ES 集群启用了安全认证,需要在请求中携带用户名和密码:

1
2
3
4
5
6
7
8
9
10
# 方式 1:URL 中包含用户信息
curl --user "elastic:els@)!" -XGET "http://localhost:9200/_cluster/health?pretty=true"

# 方式 2:使用 -u 参数(推荐)
curl -u elastic:els@)! -XGET "http://localhost:9200/_cluster/health?pretty=true"

# 方式 3:使用环境变量(更安全)
export ES_USER="elastic"
export ES_PASS="els@)!"
curl -u ${ES_USER}:${ES_PASS} -XGET "http://localhost:9200/_cluster/health?pretty=true"

安全建议

  • ✅ 避免在命令行中明文输入密码(会记录到 bash_history)
  • ✅ 使用环境变量或配置文件存储凭证
  • ✅ 生产环境建议使用 HTTPS + 证书认证

其他常用 ES 命令

1
2
3
4
5
6
7
8
9
10
11
# 查看节点信息
curl -u elastic:password -XGET "http://localhost:9200/_cat/nodes?v"

# 查看索引列表
curl -u elastic:password -XGET "http://localhost:9200/_cat/indices?v"

# 查看分片分布
curl -u elastic:password -XGET "http://localhost:9200/_cat/shards?v"

# 查看集群设置
curl -u elastic:password -XGET "http://localhost:9200/_cluster/settings?pretty=true"

三、Java JVM 诊断命令

3.1 GC 监控

使用 jstat 监控 JVM 垃圾回收情况:

1
2
3
4
5
# 查看 GC 统计信息(每 1000ms 刷新一次)
jstat -gcutil <pid> 1000

# 示例:监控 PID 为 28106 的进程
/usr/local/java/jdk1.7.0_80/bin/jstat -gcutil 28106

输出示例

1
2
S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
0.00 15.23 45.67 62.34 85.12 78.45 1234 12.345 56 23.456 35.801

字段说明

字段 含义 说明
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
2
3
4
5
6
7
8
# 导出线程堆栈到文件
jstack <pid> > thread_dump.out

# 示例:导出 PID 为 28106 的线程堆栈
/usr/local/java/jdk1.7.0_80/bin/jstack 28106 > 1.out

# 实时查看线程状态
jstack <pid> | grep -A 10 "RUNNABLE"

常见线程状态

状态 说明 排查方向
RUNNABLE 运行中 CPU 高时重点分析
BLOCKED 阻塞等待锁 检查锁竞争
WAITING 等待通知 检查条件是否满足
TIMED_WAITING 超时等待 检查 sleep/wait 时间
DEADLOCK 死锁 立即处理

分析技巧

1
2
3
4
5
6
7
8
9
10
# 查找 CPU 占用高的线程
top -Hp <pid> # 找到 CPU 高的线程 ID
printf "%x\n" <thread_id> # 转换为 16 进制
jstack <pid> | grep <hex_thread_id> -A 20 # 定位具体代码

# 查找死锁
jstack <pid> | grep -i "deadlock" -A 20

# 统计线程状态分布
jstack <pid> | grep "java.lang.Thread.State" | sort | uniq -c

3.3 类加载统计

使用 jcmd 查看类加载情况:

1
2
3
4
5
# 查看类直方图(按实例数量排序)
jcmd <pid> GC.class_histogram | more

# 示例:查看 PID 为 73812 的类加载情况
/usr/local/java/jdk1.7.0_80/bin/jcmd 73812 GC.class_histogram | more

输出示例

1
2
3
4
5
6
 num     #instances         #bytes  class name
----------------------------------------------
1: 1234567 98765432 java.lang.String
2: 234567 45678901 java.util.HashMap$Node
3: 123456 23456789 com.example.MyObject
...

分析要点

  • ✅ 关注实例数量异常的类
  • ✅ 检查是否有内存泄漏(实例数持续增长)
  • ✅ 对比不同时间点的快照,找出增长趋势

替代方案(适用于 JDK 8+):

1
2
3
4
5
# 使用 jmap(JDK 8 及以下)
jmap -histo:live <pid> | head -20

# 生成 Heap Dump(谨慎使用,会影响性能)
jmap -dump:format=b,file=heap.hprof <pid>

3.4 日志分析

从应用日志中提取性能数据:

1
2
3
4
5
# 提取耗时超过 1000 毫秒的请求
cat catalina.out | grep "信息结束耗时" | \
awk -F'信息结束耗时:' '{print $2}' | \
awk -F'毫秒' '$1 > 1000 {print $1}' | \
more

执行流程

  1. cat catalina.out:读取日志文件
  2. grep "信息结束耗时":筛选包含关键字的行
  3. awk -F'信息结束耗时:' '{print $2}':提取耗时数值部分
  4. awk -F'毫秒' '$1 > 1000 {print $1}':过滤出大于 1000 毫秒的记录
  5. more:分页显示

优化版本(带统计功能):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 统计慢请求数量和平均耗时
cat catalina.out | grep "信息结束耗时" | \
awk -F'信息结束耗时:' '{print $2}' | \
awk -F'毫秒' '{
time = $1;
if (time > 1000) {
count++;
sum += time;
if (time > max) max = time;
}
} END {
print "慢请求数量: " count;
print "平均耗时: " (count > 0 ? sum/count : 0) " 毫秒";
print "最大耗时: " max " 毫秒";
}'

实时监控版本

1
2
3
4
# 实时监控慢请求(每 5 秒刷新)
tail -f catalina.out | grep --line-buffered "信息结束耗时" | \
awk -F'信息结束耗时:' '{print $2}' | \
awk -F'毫秒' '$1 > 1000 {print strftime("%H:%M:%S") " - 慢请求: " $1 " 毫秒"}'

四、最佳实践

4.1 命令使用建议

推荐做法

  1. 日志分析前备份:重要日志先备份再分析

    1
    cp catalina.out catalina.out.bak
  2. 大文件使用流式处理:避免一次性加载到内存

    1
    2
    3
    4
    5
    # ✅ 好:流式处理
    tail -f log.txt | grep pattern

    # ❌ 不好:大文件全部加载
    cat huge_log.txt | grep pattern
  3. 组合命令使用管道:提高处理效率

    1
    grep pattern log.txt | awk '{print $2}' | sort -nr | head -10
  4. 定期清理历史数据:避免磁盘空间不足

    1
    2
    # 删除 7 天前的日志
    find /var/log -name "*.log" -mtime +7 -delete

避免做法

  1. ❌ 不要在高峰期执行 jmap -dump(会导致 STW)
  2. ❌ 不要在生产环境频繁执行 jstack(影响性能)
  3. ❌ 不要在命令行中明文输入密码
  4. ❌ 不要忽略 GC 告警信号

4.2 性能分析流程

Java 应用性能问题排查步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
发现问题(RT 飙升/CPU 高)

1. 系统层面:top/vmstat/iostat 查看资源使用

2. JVM 层面:jstat 查看 GC 情况

3. 线程层面:jstack 分析线程状态

4. 内存层面:jmap/jcmd 分析对象分布

5. 代码层面:定位热点代码/慢 SQL

6. 优化修复:代码优化/参数调整/架构改进

7. 验证监控:确认问题解决 + 持续监控

常用诊断命令速查表

问题类型 首选命令 辅助命令
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

参考资料

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×