第4章:日志查看基础命令——cat、less、more、head、tail、grep、find、wc、sort、uniq

日志排查这件事,说白了就是跟文本打交道。你面对的是成千上万行记录,如果没有趁手的工具,那真是大海捞针。我个人习惯把这十个命令分成三组:查看类、搜索类、统计整理类。今天咱们一个一个过,每个命令我都会结合真实场景来讲。

4.1 查看类命令:cat、less、more、head、tail

这四个命令是日志查看的"眼睛"。我刚开始做运维时,只会用cat,结果有一次看一个500MB的日志文件,直接把终端卡死了……嗯,从那以后我就学会了按需查看。

4.1.1 cat —— 适合小文件快速浏览

cat是concatenate的缩写,本意是连接文件,但最常用的就是直接看文件内容。不过我要提醒你:千万别用cat看大日志,它会一次性把整个文件加载到内存并输出到终端。

# 查看日志文件
cat /var/log/syslog

# 显示行号(排查问题时很有用)
cat -n /var/log/nginx/access.log

# 合并多个日志文件
cat log1.log log2.log > merged.log
⚠️ 避坑指南:我曾经在生产环境上执行过 cat huge.log,结果SSH会话直接卡死。后来学乖了,超过10MB的文件绝对不用cat。

4.1.2 less —— 我的主力查看工具

less是我个人最常用的日志查看命令。它支持上下翻页、搜索、甚至还能实时跟踪文件增长。你想想看,排查问题时经常需要来回翻看上下文,less就是为此而生的。

# 打开日志文件
less /var/log/application.log

# 常用快捷键(记牢这几个就够了)
# 空格键:下一页
# b键:上一页
# /关键词:向下搜索
# ?关键词:向上搜索
# n:下一个匹配
# N:上一个匹配
# q:退出

# 实时跟踪日志(类似tail -f)
less +F /var/log/application.log
💡 小技巧:在less中按 Shift+F 可以进入"跟随模式",日志有新内容会自动滚动到底部。按 Ctrl+C 退出跟随模式,回到普通浏览模式。这个功能我在排查线上问题时几乎天天用。

4.1.3 more —— 简单但够用

more是less的前辈,功能相对简单——只能向下翻页,不能往回翻。不过在一些嵌入式系统或最小化安装的Linux中,可能只有more没有less。这时候你至少得会用。

# 分页查看
more /var/log/messages

# 指定每页行数
more -10 /var/log/messages

4.1.4 head 和 tail —— 只看头尾

这两个命令是绝配。head看日志开头(比如检查服务启动日志),tail看日志结尾(比如查看最新错误)。

# 查看前10行(默认)
head /var/log/nginx/error.log

# 查看前50行
head -n 50 /var/log/nginx/error.log

# 查看后20行
tail -n 20 /var/log/nginx/access.log

# 实时跟踪日志(排查问题的神器)
tail -f /var/log/application.log

# 跟踪并显示行号
tail -f -n 100 /var/log/application.log
🔑 核心场景:我在排查"服务突然挂了"的问题时,标准操作就是 tail -f /var/log/app.log | grep ERROR,然后复现问题,看实时输出的错误日志。

4.2 搜索类命令:grep 和 find

日志排查的核心就是"找东西"。grep找内容,find找文件。这两个命令用好了,排查效率能提升十倍。

4.2.1 grep —— 日志排查的瑞士军刀

grep是我在日志排查中使用频率最高的命令,没有之一。它的核心功能是在文件中搜索匹配的行。

# 基本搜索
grep "ERROR" /var/log/application.log

# 递归搜索目录下所有日志
grep -r "500 Internal Server Error" /var/log/nginx/

# 显示匹配行及其前后各5行上下文
grep -C 5 "OutOfMemoryError" /var/log/tomcat/catalina.out

# 只显示匹配行前5行
grep -B 5 "FATAL" /var/log/app.log

# 只显示匹配行后5行
grep -A 5 "Exception" /var/log/app.log

# 忽略大小写
grep -i "timeout" /var/log/mysql/error.log

# 统计匹配行数
grep -c "ERROR" /var/log/application.log
💡 实战经验:我曾经遇到一个诡异的问题——日志里明明有"ERROR"关键字,但grep就是搜不到。后来发现是日志文件编码是UTF-16,而grep默认按UTF-8解析。加上 -a 参数(把二进制文件当文本处理)就解决了。

4.2.2 find —— 找文件比找内容更在行

find用来定位日志文件本身。比如你忘了日志文件放哪了,或者想找最近修改过的日志文件。

# 按名称查找日志文件
find /var/log -name "*.log"

# 查找最近1小时内修改过的文件
find /var/log -name "*.log" -mmin -60

# 查找大于100MB的日志文件(该清理了)
find /var/log -name "*.log" -size +100M

# 查找并删除7天前的日志
find /var/log -name "*.log" -mtime +7 -delete
⚠️ 注意:用find配合-delete要格外小心。我见过同事写错路径,把整个应用日志删了。建议先用 -exec ls -l {} 预览结果,确认无误后再执行删除。

4.3 统计整理类命令:wc、sort、uniq

日志排查不只是"找错误",有时候还需要做统计分析。比如"哪个IP访问最多"、"哪种错误出现最频繁"。

4.3.1 wc —— 统计行数、单词数、字符数

wc是word count的缩写。排查问题时最常用的是统计行数,快速了解日志规模。

# 统计行数
wc -l /var/log/nginx/access.log

# 统计单词数
wc -w /var/log/application.log

# 统计字符数
wc -c /var/log/application.log

# 统计所有信息
wc /var/log/application.log

4.3.2 sort —— 排序利器

sort默认按字典序排序,但日志排查中经常需要按数字排序(比如按时间、按错误码)。

# 按字典序排序
sort /var/log/nginx/access.log

# 按数字排序(比如按响应时间)
sort -n /var/log/nginx/access.log

# 逆序排序(最大的在最前面)
sort -rn /var/log/nginx/access.log

# 按第9列排序(假设日志是空格分隔)
sort -k 9 /var/log/nginx/access.log

4.3.3 uniq —— 去重与计数

uniq只能去除相邻的重复行,所以通常和sort配合使用。这个组合在统计日志中的"TOP N"问题时特别有用。

# 统计每个IP的访问次数(经典用法)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# 统计每种HTTP状态码的出现次数
grep -oP 'HTTP/\d\.\d" \K\d+' /var/log/nginx/access.log | sort | uniq -c | sort -rn
🔑 实战案例:有一次线上服务响应变慢,我用 awk '{print $NF}' access.log | sort | uniq -c | sort -rn | head -20 统计了响应时间分布,发现大量请求的响应时间集中在5秒以上。顺着这个线索,最终定位到数据库连接池配置问题。

4.4 知识体系总览

下面这张图是我自己总结的日志查看命令知识体系,你可以把它当作"作战地图"来用。

日志查看基础命令知识体系 查看类命令 搜索类命令 统计整理类 cat less more head/tail grep find wc sort uniq 典型组合:grep + sort + uniq + head 实现日志统计TOP N 常见排查场景 🔍 实时跟踪:tail -f + grep 📊 错误统计:grep -c + sort + uniq 🗂️ 文件定位:find + grep 组合搜索 📈 性能分析:awk + sort -rn + head

4.5 实战组合拳

单独学每个命令不难,难的是把它们组合起来解决实际问题。我分享几个我在项目中用过的组合:

排查场景 命令组合 说明
实时监控错误 tail -f app.log | grep --line-buffered ERROR --line-buffered确保每行立即输出
统计TOP 10错误 grep ERROR app.log | sort | uniq -c | sort -rn | head -10 先过滤,再排序去重,最后取前10
查找大日志文件 find /var/log -name "*.log" -size +500M 快速定位需要清理的日志
统计每小时请求量 awk '{print $4}' access.log | cut -d: -f1,2 | sort | uniq -c 提取时间字段,按小时统计
💡 我的建议:不要死记硬背命令参数。你只需要记住"我要做什么"——比如"我要统计"、"我要搜索"、"我要排序"——然后查一下对应命令的用法就行。用得多了,自然就记住了。

好了,这十个命令是日志排查的"基本功"。说白了,排查日志就像侦探破案,这些命令就是你的放大镜和指纹粉。多练多用,慢慢你就能体会到"一条命令搞定一个排查场景"的快感了。

可可精品资料库