4. 日志分析工具:grep/awk/sed基础、日志分析脚本编写、日志可视化工具

说到基站日志分析,我见过太多人一上来就打开文件用肉眼硬看。几万行的日志,你想想看,那得看到什么时候去?

我个人习惯是:先让工具干活,我再做判断。今天就把我压箱底的三板斧——grep、awk、sed,以及怎么把它们串起来写脚本,还有可视化那点事,一次性讲透。

4.1 三剑客基础:grep、awk、sed

这三个工具,说白了就是Linux文本处理的「左膀右臂」。我在项目里排查基站告警,90%的情况靠它们就能搞定。

4.1.1 grep:快速定位关键行

grep 就是「找东西」的。基站日志里告警、错误、异常,统统用 grep 一把抓出来。

# 查找所有包含 "ALARM" 的行
grep "ALARM" bts_log.txt

# 忽略大小写,查找 error
grep -i "error" bts_log.txt

# 显示匹配行的前后5行上下文
grep -C 5 "RRC Connection Failure" bts_log.txt

# 递归搜索整个日志目录
grep -r "S1AP_Setup" /var/log/bts/
我的小技巧: 排查基站断站时,我习惯先用 grep -c "ALARM" 看看告警总数,心里先有个底。如果告警数上千,那基本是批量故障,别逐条看了。

4.1.2 awk:按列提取与统计

grep 找到行,awk 负责「切」出列。基站日志通常是空格或逗号分隔的,awk 正好派上用场。

# 打印第1列(时间戳)和第5列(告警码)
awk '{print $1, $5}' bts_log.txt

# 以逗号分隔,打印第2和第4列
awk -F',' '{print $2, $4}' alarm.csv

# 统计每种告警码出现的次数
awk '{count[$5]++} END {for (c in count) print c, count[c]}' bts_log.txt

实战场景: 有一次基站频繁闪断,我用 awk 统计了「Cell ID」列,发现某个小区出现次数是其他小区的10倍。嗯,问题锁定在那个小区了。

4.1.3 sed:流式编辑与替换

sed 是「改」的。日志里时间格式不对、IP地址要脱敏、或者批量替换告警级别,sed 一把梭。

# 将所有 "WARNING" 替换为 "WARN"
sed 's/WARNING/WARN/g' bts_log.txt

# 删除所有空行
sed '/^$/d' bts_log.txt

# 只打印第100到200行
sed -n '100,200p' bts_log.txt

# 在原文件直接修改(小心!)
sed -i 's/192.168.1./10.0.0./g' bts_log.txt
我曾经踩过的坑:sed -i 直接修改日志文件,结果把关键证据改没了。后来我学乖了,先备份再操作:cp log.txt log.txt.bak

4.2 日志分析脚本编写

单条命令是散兵游勇,写成脚本才是正规军。我一般把常用的分析流程写成 shell 脚本,一键执行。

4.2.1 一个完整的基站告警分析脚本

#!/bin/bash
# 基站告警分析脚本 - 作者:资深网工
# 用法:./alarm_analyzer.sh /var/log/bts/current.log

LOG_FILE=$1
REPORT="alarm_report_$(date +%Y%m%d).txt"

echo "========== 基站告警分析报告 ==========" > $REPORT
echo "分析时间: $(date)" >> $REPORT
echo "日志文件: $LOG_FILE" >> $REPORT
echo "" >> $REPORT

# 1. 统计告警总数
TOTAL=$(grep -c "ALARM" $LOG_FILE)
echo "告警总数: $TOTAL" >> $REPORT

# 2. 按告警级别分类
echo "" >> $REPORT
echo "--- 告警级别分布 ---" >> $REPORT
grep "ALARM" $LOG_FILE | awk '{print $3}' | sort | uniq -c | sort -rn >> $REPORT

# 3. 找出TOP 5频繁告警
echo "" >> $REPORT
echo "--- TOP 5 频繁告警 ---" >> $REPORT
grep "ALARM" $LOG_FILE | awk -F'|' '{print $2}' | sort | uniq -c | sort -rn | head -5 >> $REPORT

# 4. 提取关键时间段的告警
echo "" >> $REPORT
echo "--- 凌晨2-4点告警(疑似批量故障)---" >> $REPORT
grep "ALARM" $LOG_FILE | grep -E "(02:|03:|04:)" >> $REPORT

echo "分析完成!报告已保存至: $REPORT"
我的建议: 把这个脚本放到 /usr/local/bin/ 下,加上执行权限。以后排查故障,直接敲 alarm_analyzer.sh 日志文件,省时省力。

4.2.2 定时分析 + 邮件告警

光有脚本还不够,我习惯用 cron 定时跑,出问题自动发邮件。

# crontab 配置:每小时分析一次
0 * * * * /home/bts/scripts/alarm_analyzer.sh /var/log/bts/current.log

# 如果告警数超过阈值,发邮件
if [ $TOTAL -gt 100 ]; then
    mail -s "基站告警超阈值" admin@company.com < $REPORT
fi

4.3 日志可视化工具

脚本输出的是文本,但人眼对图表更敏感。我常用的可视化方案有这几种。

4.3.1 用 Excel 做快速可视化

别笑,Excel 其实是最快的。把 awk 统计结果导出为 CSV,直接拖进 Excel 生成折线图或柱状图。

# 导出告警时间序列
awk '{print $1, $2, $5}' bts_log.txt > alarm_timeline.csv

# 用 Excel 打开,插入 -> 折线图,趋势一目了然

4.3.2 用 Python + Matplotlib 做专业图表

需要更精细的图表时,我写个简单的 Python 脚本。

import matplotlib.pyplot as plt
import pandas as pd

# 读取日志统计结果
data = pd.read_csv('alarm_stats.csv')
plt.figure(figsize=(10, 6))
plt.bar(data['alarm_type'], data['count'])
plt.title('基站告警类型分布')
plt.xlabel('告警类型')
plt.ylabel('出现次数')
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('alarm_distribution.png')

4.3.3 用 Grafana 做实时监控大屏

对于生产环境,我强烈推荐 Grafana。把日志导入 Elasticsearch 或 Prometheus,Grafana 上拖拽几下就能生成实时仪表盘。

工具 适用场景 上手难度 我的推荐指数
Excel 临时分析、快速出图 ★☆☆☆☆ ★★★★☆
Python Matplotlib 定制化图表、报告生成 ★★★☆☆ ★★★★★
Grafana 实时监控、运维大屏 ★★★★☆ ★★★★★

总结一下: grep 找线索,awk 做统计,sed 做清洗,脚本串流程,可视化出结论。这套组合拳打下来,再复杂的基站日志也能被你治得服服帖帖。

我个人最常用的组合是:grep + awk + 导出CSV + Excel,5分钟就能出一份像样的分析报告。你试试看,绝对比肉眼硬看强一百倍。

最后提醒一句: 日志分析工具再强,也替代不了你对基站原理的理解。工具是放大镜,真正的洞察力还是在你脑子里。别光顾着玩命令,忘了思考「为什么会这样」。