后台日志查询手册:cd、ls、grep、less组合

后台日志查询手册:cd、ls、grep、less组合
文章目录日志的老巢藏在哪儿核心命令逐个击破1cd任意门去自己想去的地方2ls照妖镜看看里面都有啥3grep大海捞针的神器日志查询界的CtrlF4less大文件阅读器按需加载5grepless组合综合实例场景1用户反馈支付失败半小时内定位场景2想知道某个时间段发生了什么场景3统计今天不同类型的错误数量后台日志“黄金排查五步法”常见的操作错误与grep 相关与less有关与cd 相关与ls 相关通用错误日志的老巢藏在哪儿绝大多数Linux系统的日志都住在 /var/log/ 这个目录下。就好比公司所有部门的档案都放在一个档案室里/var/log/ 就是这个档案室。常见的几个住户日志文件通俗解释/var/log/messages系统级别的大杂烩日志啥都往里面记/var/log/secure安全相关日志有人暴力破解你的SSH密码这里会记下来/var/log/nginx/access.logNginx访问日志——谁来过你的网站/var/log/nginx/error.logNginx错误日志——网站为啥打不开/var/log/application.logJava/Go/Python应用日志具体名字看公司怎么配备注如果公司日志还可能在 /opt/应用名/logs/ 或者 /home/应用名/logs/ 下。实在找不到用 find / -name “*.log” | head -10 先搜几个看看。一条典型的应用日志大概长这样2026-07-23 14:32:15.123 ERROR [payment-service] [thread-42] com.example.PaymentService - 支付接口调用失败订单号ORD123456超时时间已到拆开看就是时间 日志级别 服务名 线程 类名 具体信息。这个结构很适合用 grep 抓取的时候精准查询。核心命令逐个击破1cd任意门去自己想去的地方cd 的全称是 change directory“切换到哪个文件夹”。基础用法是步骤基础用法去日志目录最常用cd /var/log回到家目录类似Windows按Home键cd ~回到上一个目录方便在两个目录间来回横跳cd -去根目录cd /备注刚连上服务器不知道自己在哪先敲个 pwdprint working directory看看当前路径然后再 cd 去想去的地方。2ls照妖镜看看里面都有啥ls 是 list 的缩写功能就是列出当前目录下的所有文件和文件夹。基础用法是步骤基础用法按时间排序最新的在最下面最常用ls -lt显示详细信息权限、大小、修改时间ls -l按时间排序最新的在最上面配合head使用更佳ls -lt人类可读的文件大小显示1K、2M、3G而不是1024、2048ls -lh显示隐藏文件以.开头的文件ls -a详细信息 人类可读 按时间排ls -lth按时间正序最旧的在最上面ls -ltr举例进到日志目录敲 ls -lt就能看到最新的日志文件在最下面因为很多系统日志滚动生成最新的文件往往在列表末尾。如果想看最新的是哪个直接 ls -lt | tail -1。3grep大海捞针的神器日志查询界的CtrlFgrep 是 Global Regular Expression Print 的缩写全局正则匹配输出。grep命令最基本的用法在app.log里找所有包含ERROR的行 grep “ERROR” app.log参数含义例子-iignore-case 忽略大小写找错误但记不清是大写还是小写grep -i “error” app.log-nline-number 显示行号grep -n “timeout” app.log-B 5Before 显示匹配行的前5行grep -B 5 “Exception” app.log-A 5After 显示匹配行的后5行grep -A 5 “Exception” app.log-C 5Context 显示前后各5行grep -C 5 “Exception” app.log-rrecursive 递归搜索目录grep -r “NullPointer” ./-E扩展正则支持多个关键词grep -E ERROR-vinvert 反向匹配排除grep -v “DEBUG” app.log-ccount 只统计行数grep -c “ERROR” app.log-i、-n、-B/-A 这三个能解决80%的问题。详细说明再举例子场景用法解析找错误但记不清是大写还是小写grep -i “error” app.log不管error、Error、ERROR都能找到找到错误后我想看看上下文到底前面发生了啥写法1grep -B 3 -A 5 “支付超时” app.log显示前3行和后5行找到错误后我想看看上下文到底前面发生了啥写法2grep -C 5 “支付超时” app.log前后各5行日志太吵了DEBUG信息刷屏我想屏蔽掉grep -v “DEBUG” app.log | grep “ERROR”先去掉DEBUG行再找ERROR想同时查超时和连接失败两种情况写法1grep -E “超时|连接失败” app.log同时查想同时查超时和连接失败两种情况写法2grep -e “超时” -e “连接失败” app.log同时查不知道在哪个文件里但我要搜整个目录grep -rn “订单号ORD123456” ./logs/r递归 n显示行号只想知道今天一共报了多少次错grep -c “ERROR” app.log输出一个数字grep配合正则表达式grep “^2026-07-23” app.log匹配以2026-07-23开头的行grep配合正则表达式grep “ERROR$” app.log匹配以ERROR结尾的行grep配合正则表达式grep “[0-9]{6}” app.log匹配6位连续数字比如订单号里的数字查最新报错带上下文忽略大小写限制行数实时跟踪tail -f app.log | grep -i -C 3 error | head -50组合查询4less大文件阅读器按需加载less最基本的使用方式less app.log常用的less快捷键按键作用备注空格键 或 f向下翻一页最常用b向上翻一页backwards回车 或 j向下翻一行k向上翻一行g跳到文件开头go to topG跳到文件末尾go to bottom/关键词向下搜索关键词按n找下一个N找上一个?关键词向上搜索关键词按n找下一个N找上一个F实时跟踪文件更新类似tail -f按 CtrlC 停止q退出quit-N显示行号需在less内输入然后回车组合举例我打开了一个日志文件想找最近的一次异常按 G 跳到最后按 ?Exception 从下往上搜看到第一个异常后按 n 继续往上找更早的看完按 q 退出 5grepless组合按键作用grep -n “ERROR” app.log | less搜索所有ERROR然后用less分页浏览grep --coloralways “ERROR” app.log | less -R带颜色高亮看着更舒服tail -f app.log | grep --coloralways “ERROR|WARN” | less -R实时跟踪 过滤 分页grep --line-buffered ERROR app.log | less -R实时过滤大日志grep -C 5 ERROR app.log | less -R管道后不丢上下文查看匹配行的上下文grep --colornever ERROR app.log | less -S不用颜色避免宽字符错位只看关键行且能左右滑动要注意的点1less -R 是让 less 能显示颜色转义符不然 --coloralways 会显示成乱码。2现象grep long_running.log | less 时屏幕长时间无输出最后突然刷出一大堆。原因grep 默认使用块缓冲Block Buffer。当输出到管道非终端时它会攒够 4KB~8KB 数据才写入导致 less 收不到实时流。解决方案三选一强制行缓冲推荐grep --line-buffered pattern file | less使用 stdbufstdbuf -oL grep pattern file | less改用 awkawk ‘/pattern/{print; fflush()}’ file | less灵活性最高3现象我想在 less 中左右滑动看长行less -S使用grep | less -S 默认会截断匹配行的尾部只显示屏幕宽度内的内容。如果用 grep 只匹配了行首尾部报错信息可能直接被 less 物理裁剪根本滑动不出来。解决必须加上 -R 参数保留原始行长度grep pattern file | less -SRS 允许水平滚动R 保留完整原始字符。4现象grep --coloralways 搭配 less 后屏幕出现大量 ESC[01;31m 乱码或者搜索时高亮错位。解决三选一精准匹配保留颜色推荐grep --coloralways pattern file | less -R-R 解析 ANSI 颜色转义码。去掉颜色管道场景grep --colornever pattern file | less更干净便于二次复制粘贴。极简替代直接用 less 自己的高亮less -p pattern file连 grep 都省了。5现象退出 less 后终端输入命令看不见字符或者按回车不换行。原因grep 如果匹配到了二进制文件或包含控制字符如 \r的内容less 会将终端的回显模式Echo搞乱。解决方案强制过滤二进制grep -a pattern file | less-a 将二进制当文本处理。万能恢复命令如果已经错乱盲打 reset 回车或者 stty sane 回车恢复。6场景grep huge.log | less我在 less 中按 q 快速退出。less 退出了但管道那头的 grep 可能还在后台拼命扫描巨大的日志文件耗尽 CPU 和 IO。解决手动清理退出后立即执行 jobs 查看kill %1 杀掉残留的 grep。自动跟随终极方案直接使用 less F 模式实时跟踪文件末尾less F huge.log按 CtrlC 进入普通 less 浏览模式 按 键输入关键字如 ERRORless 会动态过滤显示比 grep 管道快得多且无残留。综合实例场景1用户反馈支付失败半小时内定位操作命令1. 进入日志目录cd /opt/payment-service/logs2. 看看最新的日志文件是哪个ls -lt | head -53. 先看最后100行摸摸情况tail -100 app.log4. 搜索支付失败关键词带上下文grep -B 5 -A 10 “支付失败” app.log5. 如果支付失败和某个订单号有关根据订单号追查grep -B 10 -A 10 “ORD123456” app.log6. 如果日志滚动太快用less慢慢看grep -n “支付” app.log | less场景2想知道某个时间段发生了什么操作命令方法1直接grep时间grep “2026-07-23 15:” app.log方法2用sed截取时间段sed -n ‘/2026-07-23 14:50/,/2026-07-23 15:10/p’ app.log方法3结合awkawk ‘/2026-07-23 14:50/,/2026-07-23 15:10/’ app.log场景3统计今天不同类型的错误数量操作命令统计ERROR总数grep -c “ERROR” app.log统计不同错误类型的次数grep “ERROR” app.log | awk -F ’ - ’ ‘{print $3}’ | sort | uniq -c | sort -rn查历史报错统计频率排序grep -i -o “error.*” app.log | sort | uniq -c | sort -nr | head -20备注【grep “ERROR” app.log | awk -F ’ - ’ ‘{print $3}’ | sort | uniq -c | sort -rn】的完整流程1grep “ERROR” app.log → 筛选出所有包含ERROR的日志行2awk -F ’ - ’ ‘{print $3}’ → 提取第三列错误类型3sort → 按字母排序4uniq -c → 统计每种错误出现次数5sort -rn → 按次数从高到低排序-r 降序-n 数值排序假设 app.log 内容如下2026-07-25 08:00:01 - INFO - Service started2026-07-25 08:05:12 - ERROR - Connection timeout2026-07-25 08:10:33 - WARN - Memory usage 85%2026-07-25 08:15:44 - ERROR - Connection timeout2026-07-25 08:20:55 - ERROR - Database deadlock2026-07-25 08:25:06 - INFO - User login success2026-07-25 08:30:17 - ERROR - Disk full2026-07-25 08:35:28 - ERROR - Connection timeout2026-07-25 08:40:39 - ERROR - Database deadlock2026-07-25 08:45:50 - ERROR - Connection timeout2026-07-25 08:50:01 - INFO - Health check ok1grep “ERROR” app.log → 筛选出所有包含ERROR的日志行作用只保留包含 “ERROR” 的行处理过程逐行检查有ERROR就留下没有就丢掉处理结果2026-07-25 08:05:12 - ERROR - Connection timeout2026-07-25 08:15:44 - ERROR - Connection timeout2026-07-25 08:20:55 - ERROR - Database deadlock2026-07-25 08:30:17 - ERROR - Disk full2026-07-25 08:35:28 - ERROR - Connection timeout2026-07-25 08:40:39 - ERROR - Database deadlock2026-07-25 08:45:50 - ERROR - Connection timeout2awk -F ’ - ’ ‘{print $3}’ → 提取第三列错误类型作用用 - 作为分隔符取第3列错误类型处理过程每一行按 - 切开取第3部分处理结果Connection timeoutConnection timeoutDatabase deadlockDisk fullConnection timeoutDatabase deadlockConnection timeout3sort → 按字母排序作用按字母顺序排序A→Z处理过程把上面7行按字典序排列处理结果排序后所有相同的排在一起第2步数据更新为Connection timeoutConnection timeoutConnection timeoutConnection timeoutDatabase deadlockDatabase deadlockDisk full4uniq -c → 统计每种错误出现次数作用统计相邻的相同行出现的次数处理过程每一组连续相同的行计个数处理结果4 Connection timeout2 Database deadlock1 Disk full5sort -rn → 按次数从高到低排序-r 降序-n 数值排序作用按数字-n降序-r排列即从多到少处理结果排序后次数多的排最前面第4步的数据更新为4 Connection timeout2 Database deadlock1 Disk full这里正好已经是降序了所以看起来没变化。但如果顺序是 1, 4, 2就会变成 4, 2, 1。最终结果所以是4 Connection timeout2 Database deadlock1 Disk full错误类型出现次数含义解读Connection timeout4 次最高优先排查Database deadlock2 次中等Disk full1 次较低后台日志“黄金排查五步法”口诀先定目录再看文件尾巴扫一眼grep抓重点搜不到就递归翻。步骤命令目的第1步cd /var/log/应用名/找到路径第2步ls -lt | head锁定目标文件实时数据是看最新的那个文件非实时数据看公司对应按照时间归类的文件第3步tail -200 app.log先看最新200行快速了解当前状态第4步grep -i -B 3 -A 5 “关键词” app.log精准打击找到报错上下文第5步grep -rn “关键词” ./ | less如果没找到扩大搜索范围到整个目录备注1如果关键词的识别度高可以直接操作第1步、第4步即可出来具体的数据。2实时文件可以精准搜索app.log非实时文件可以模糊匹配搜索app.*.log 。常见的操作错误与grep 相关grep 忘记用 -i 忽略大小写❌ grep “error” app.log 结果啥也没有其实里面有 ERROR✅ 养成习惯查英文关键词一律加 -i搜索时只搜固定字符串不会用正则❌ 搜 “订单号123” 搜不到因为日志里是 “订单号123”✅ 学会用 grep -E “订单号.*123” 通配匹配❌ 搜中文时忘记字符编码grep “错误” app.log 搜不到因为日志可能是 GBK 编码✅ 先 file -i app.log 看编码再用 iconv 转码或 grep -a 强制当文本处理❌ grep 后只看到匹配行没有上下文看到一行 “ERROR” 但不知道前后发生了什么✅ 学会 -C 5前后5行、-A 5后5行、-B 5前5行❌ 搜多个关键词只会用 grep a | grep b管道多了效率低且可能漏掉顺序✅ 用 grep -E “a|b”或关系、grep -E “a.*b”先后关系❌ 搜 IP 或数字时被特殊字符干扰grep “192.168.1.1” 里的 . 是正则通配符会匹配 “192X168X1X1”✅ 用 grep -F “192.168.1.1” 或 fgrep当作纯字符串匹配❌ 日志在滚动grep 完又出新日志想实时监控grep “ERROR” app.log 只查历史✅ 用 tail -f app.log | grep --line-buffered “ERROR” 实时过滤与less有关less 打开了不知道怎么退出❌ 狂按 CtrlC 没用然后关掉终端重连✅ 记住q 键退出查日志用 cat 打开几G的文件❌ 服务器卡死被运维拉黑✅ 大文件用 less看最新几行用 tail❌ 打开大文件后想跳到最后一行按 G 但等太久less 默认会加载整个文件到末尾大文件卡死✅ 用 less -N app.log 显示行号打开后按 ShiftG 跳到末尾但要等更优less G app.log 直接打开在末尾❌ 搜索时 /error 只搜到第一个想继续看下一个按 n 是下一个但方向反了✅ / 向下搜按 n 继续向下N 向上? 向上搜按 n 继续向上❌ 看到一半想看别的文件退出再进麻烦✅ less 里输入 :e /path/to/other.log 切换文件:n 和 :p 浏览多个文件启动时 less file1 file2❌ 想复制一行内容鼠标选中但拖不动✅ less -S 模式按 ←→ 横滚复制用 v 键 调出 vi 编辑器在里面复制更舒服与cd 相关❌ 以为 cd 能直接切到文件cd /path/to/file.log → 报错Not a directory✅ 记住cd 只能接目录想进文件所在目录用 cd $(dirname /path/to/file.log) 或先 cd /path/to/ 再操作文件❌ 用相对路径在深层目录里绕晕cd …/…/…/…/…/ 然后迷路pwd 一看不知道自己在哪✅ 多用 cd - 切回上一个目录cd ~ 快速回家pushd/popd 管理目录栈高频切换神器❌ 手滑输入 cd / 然后执行了 rm -rf *这个属于操作习惯✅ 养成习惯cd 后立刻 pwd 确认与ls 相关❌ 用 ls 看目录文件太多直接刷屏日志目录下几万个文件ls 一下终端卡死✅ 用 ls -ltr 按时间排序最新文件在最后配合 | tail用 ls -lh 看人类可读的文件大小❌ 只看文件名不知道是文件还是目录ls 默认不区分容易误操作✅ 养成习惯ls -l 或 ls -F目录会带 / 后缀可执行文件带 *❌ 想查隐藏文件如 .env却漏了ls 默认不显示点文件✅ 用 ls -la 或 ls -A排除 . 和 …通用错误日志文件路径搞错❌ 以为日志都在 /var/log/ 下✅ 先去应用部署目录找一般叫 logs 或 log 不同模块会有不同路径❌ 命令输一半发现权限不够直接 sudo !!有时会把上一个危险命令也 sudo 了✅ 先 history 看编号再用 !编号 精准重跑或者 sudo ! 前先看一眼上条命令是什么❌ 通配符 * 不加引号文件名带空格直接炸rm -rf * 遇到文件名 “my log file.log” 会拆成多个参数✅ 用 find . -name “*.log” -exec 代替裸 *或加引号 grep “error” * 加 – 分隔参数❌ 查进程用 ps -ef | grep java结果 grep 自己也被搜出来✅ 用 ps -ef | grep [j]ava方括号技巧grep 命令本身不匹配或者 pgrep -f java❌ 磁盘满了du 扫半天不知道哪里最大du -sh * 在根目录执行会扫所有挂载点✅ 用 ncdu /交互式按 d 删除按 n 排序没装的话用 du -h --max-depth1 | sort -hr