Linux日志分析利器:less与more命令详解 📅 发布时间:2026/9/3 8:05:30 👁 浏览次数: 排查线上问题时遇到一个几百 MB 的日志文件很多人第一反应是cat结果终端瞬间刷出几万行内容想往前翻又翻不回去也有人习惯用vim结果文件稍微大一点打开要等好几秒操作起来还会卡顿。这种情况更适合用分页器Pager来查看文件。本文是《Linux 系统命令》系列的第 36 篇集中讲解less和more这对查看大文件的命令从基本用法到搜索、跳转、过滤、实时跟踪等实战技巧一次说清楚。1. 背景为什么查看大文件要用分页器1.1 cat、tail、vim 查看大文件的痛点先来看最常见的三个命令在大文件场景下有什么问题。cat会把文件内容一次性全部输出到终端。如果一个文件有几十万行终端会一直滚动你根本来不及看前面的内容。更麻烦的是终端缓冲区是有限的刷屏内容过多时还会导致前面内容彻底丢失卡顿严重时只能按Ctrl C终止操作体验很差。tail适合查看文件末尾的内容例如tail -n 100 app.log查看最后 100 行或者tail -f app.log实时跟踪日志。但它只能从尾部看如果你要查看文件中间某一段或者想从头到尾浏览一遍tail就抓瞎了。vim是强大的文本编辑器但它不是专门为“快速查看大文件”设计的。vim打开文件时会加载文件到编辑缓冲区还要维护撤销记录、语法高亮等数据遇到几个 GB 的日志文件时可能在打开阶段就消耗大量内存和 CPU甚至触发交换分区操作起来也明显迟滞。相比之下less和more这类分页器一次只显示一屏内容按需读取文件块不需要把整个文件都加载到内存所以更适合大文件的快速浏览、搜索和定位。1.2 分页器是什么分页器Pager是一种支持分屏显示内容的工具核心思想是不要一次性把全部内容丢到屏幕上而是显示一部分等你翻页后再显示下一部分。这样既节省内存又能避免终端刷屏。more是 20 世纪 80 年代出现的传统分页器名字很直白给我更多内容。less是它的增强版功能比more更多名字也带着幽默——less本意是“更少”但功能却是“更多”。后来 Linux 社区也流传一个梗less is more。这里不是哲学讨论而是指less命令确实比more命令更强大。在多数 Linux 发行版中man手册默认使用的分页器就是less这也印证了less的普及度。我们日常开发、运维、日志分析中less的使用频率会远高于more但more在脚本和最小化系统中仍然有一席之地所以两者都值得掌握。1.3 less 和 more 的定位差异简单来说more功能简单基本只能向下翻页偶尔向前翻页还受缓冲区限制。适合快速浏览文件内容或者在追求最小依赖的脚本环境中使用。less支持上下自由翻页、双向搜索、指定行跳转、多文件切换、实时跟踪、颜色显示几乎是more的超集。所以在真实工作中你更常用的是less但你会发现有些系统因为安装的是精简版只提供more此时掌握more的基本操作也能应急。2. 环境准备版本确认与测试文件2.1 查看 less 和 more 是否已安装在动手之前先确认你的系统里有没有这两个命令。绝大多数的 Linux 发行版默认都安装了less而more通常来自util-linux或busybox。# 查看 less 版本 less --version # 查看 more 版本 more --versionless --version会打印类似less 590 (GNU regular expressions)的信息不同发行版内置版本不同以你机器上的实际输出为准。more --version有些系统可能不支持--version参数会直接报错这不代表more不可用直接用more --help测试一下即可。如果你使用的是最小化安装的系统可能会提示找不到命令此时可以通过包管理器安装# CentOS / RHEL / Rocky Linux sudo yum install less # Ubuntu / Debian sudo apt update sudo apt install lessmore一般不需要单独安装它通常随系统基础工具集一起提供。如果确实找不到可以检查busybox是否安装因为busybox more在许多精简镜像中都是可用的。2.2 生成测试文件为了演示less和more的用法这里先生成一个 30 万行的测试日志文件里面包含INFO和ERROR两种关键字方便后续做搜索和过滤演示。awk BEGIN { for (i 1; i 300000; i) { msg (i % 5 0) ? INFO normal operate : ERROR timeout after 5000ms printf %06d 2025-01-01 10:00:00 %s\n, i, msg } } big.log这个命令会在当前目录生成一个big.log写入了 30 万行日志。i % 5 0的意思是当行号能被 5 整除时生成INFO行否则生成ERROR行这样文件里大约有 6 万行INFO和 24 万行ERROR。接下来确认文件是否生成成功wc -l big.log ls -lh big.log预期输出大致是300000 big.log -rw-r--r-- 1 user user 16M Jan 1 10:00 big.log文件大小会因为系统环境和日志内容略有不同但十几 MB 的文本日志足够用来模拟真实场景下的翻页、搜索和跳转操作。如果你有条件也可以把真实的生产日志复制到测试目录后再练习但要注意脱敏和权限问题。3. more 命令详解3.1 基本语法和交互按键more的基本语法是more [options] [file...]不带参数直接打开文件屏幕会显示文件开头的内容底部出现类似--More--(4%)的提示表示当前显示到了文件的 4% 位置。more big.log进入more的交互界面后常用按键如下按键作用空格或z向下翻一屏回车向下翻一行b或CtrlB向上翻一屏显示当前行号:f显示当前文件名和行号/pattern向下搜索指定内容n跳转到下一个匹配结果q或Q退出more这里需要注意一点more的向上翻页能力比较弱。b是否能成功向上翻取决于文件内容是否已经被读入缓冲区如果前面的内容还没加载就没法向上翻。所以more本质上更适合“顺序往下看”的场景。3.2 常用选项more的选项没有less多但有几个很实用# 每屏只显示 10 行 more -10 big.log # 压缩连续多个空行只显示一个空行 more -s big.log # 清屏后再显示避免终端被覆盖影响观感 more -c big.log # 从第 1000 行开始显示 more 1000 big.log # 从匹配 ERROR 的行的前两行开始显示 more /ERROR big.log其中-后面直接跟数字表示每屏显示的行数数字越大每屏内容越多。/pattern在很多系统上是支持的它会在打开文件后直接定位到第一个匹配ERROR的位置附近适合日志排障时快速进入关键字上下文。接下来实际运行一下more -5 1000 big.log这个命令表示从第 1000 行开始显示每屏只显示 5 行。屏幕会显示第 1000 行到第 1004 行的内容底部提示--More--(0%)或继续显示百分比。按空格可以向下继续翻按回车逐行移动。如果想把文件中连续多个空行压缩显示可以用more -s big.log这个选项在查看配置文件时很实用因为很多配置文件中存在大量空行压缩之后更容易观察有效配置项。3.3 more 的局限性more虽然简单但局限性也比较明显默认方向是单向向下向上翻页能力很弱。搜索只能向下搜索不能反向搜索。不能直接跳转到指定行号只能依赖num启动参数。不能显示行号。在管道场景下受缓冲限制会更明显。如果你的需求只是“快速从头到尾翻一遍”more是够用的。但如果需要频繁搜索、上下翻页、跳转行号more就不太趁手了这时应该切换到less。4. less 命令详解4.1 基本用法less的基本语法less [options] [file...]直接打开刚才生成的测试文件less big.log和more不同的是less底部默认会显示文件名并且在右下角显示当前浏览位置。你按q退出终端会恢复原样屏幕上不会残留大段内容。打开文件后最常用的操作就是翻页和移动光标。按键作用空格或PgDn向下翻一屏b或PgUp向上翻一屏回车向下翻一行j向下移动一行k向上移动一行g跳到文件第一行G跳到文件最后一行100g跳到第 100 行50%跳到文件 50% 位置q退出less注意在less中虽然方向键也能用但在某些终端环境比如终端类型没有正确设置时方向键可能不工作。此时使用j和k是最可靠的选择这也是less继承自vi编辑器的移动方式。4.2 搜索与过滤搜索是less最核心的能力之一也是查看日志时使用频率最高的操作。向下搜索# 打开 big.log 后按下 / 键输入 ERROR 再回车 /ERROR搜索到内容后匹配到的关键字会高亮显示。按n跳到下一个匹配按N跳到上一个匹配。向上搜索?ERROR?与/的区别在于搜索方向不同/是从当前位置向下找?是从当前位置向上找。在日志文件中如果你已经看到某个错误的后续输出想回头找同一条错误的前面部分?会很方便。默认情况下less的搜索是区分大小写的。如果希望忽略大小写可以在启动时加-i参数less -i big.log这样搜索error也能匹配到ERROR、Error等大小写变体。如果只想看文件中匹配某些关键字的行可以使用过滤功能。在less界面中输入ERROR此时屏幕只显示包含ERROR的行其他行会被隐藏。这个功能在日志分析中特别有用它不会修改原文件只是显示层级的过滤。要取消过滤再次输入后直接回车即可。4.3 更详细的显示选项less有很多实用的显示选项推荐几个日常最常用的# 显示行号 less -N big.log # 显示更详细的状态信息包括文件名、行号、百分比、字节数 less -M big.log # 截断长行不自动换行需要横向滚动查看 less -S big.log # 保留 ANSI 颜色转义序列查看带颜色输出的日志时很有用 less -R big.log这几个选项经常组合在一起使用less -NMS big.log-N显示行号-M显示详细状态-S截断长行。这样打开日志后每一行都有行号查看错误位置非常直观。-S配合左右方向键可以横向滚动适合查看 JSON 单行日志或超长 SQL 日志。如果你觉得每次都要输入这些参数太麻烦可以把它们配置成默认值后面章节会讲到。4.4 多文件查看less可以一次打开多个文件less big.log app.log info.log打开多个文件后使用:n切换到下一个文件使用:p切换到上一个文件使用:x切换到第一个文件。输入:d可以把当前文件从文件列表中移除。如果当前文件需要临时编辑可以按v调用默认编辑器编辑文件默认一般是vi。4.5 与管道结合使用less不只能查看文件还能接收管道输入这是日常开发中非常实用的能力。# 查看 ps 命令的输出 ps aux | less # 查看 grep 过滤后的日志 grep ERROR big.log | less # 查看目录内容 ls -lh /etc/ | less这种用法能防止大量输出刷屏。尤其是grep匹配结果很多时如果直接输出到终端可能一下滚过去几千行加上| less之后就能一屏一屏地耐心看。5. 实战用 less 查看大型日志的完整流程5.1 场景说明假设有一份线上服务的日志app.log大约 1 GB包含大量请求日志和错误堆栈。现在我们想定位最近一次出现ERROR的位置并查看它前后的上下文。在开始之前先用ls -lh app.log看看文件大小。如果文件确实很大千万不要用cat直接打开也不要轻易用vim强制编辑推荐使用less。5.2 打开文件并定位关键字使用下面的命令打开日志并直接定位到第一个ERRORless -N /ERROR app.log这里-N表示显示行号/ERROR表示打开文件后自动搜索第一个ERROR并定位过去。打开后你看到的可能是类似下面的内容12345 2025-01-01 10:12:33 ERROR get user info failed: timeout after 5000ms 12346 2025-01-01 10:12:34 INFO retry request, attempt1按n可以继续跳到下一个ERROR按N回到上一个ERROR。用这个方法可以快速浏览错误发生的位置和频率。5.3 查看上下文找到某个可疑的ERROR后通常需要看它前后的日志来确定原因。按j向下移动一行。按k向上移动一行。按空格翻一屏。按b向上翻一屏。按G直接跳到文件末尾看看是否有最新的错误。如果错误堆栈很长想跳过无关内容可以直接搜索堆栈中出现的异常类名比如/NullPointerException这样能快速定位到异常堆栈的起始位置。5.4 过滤并保存关键信息如果ERROR出现次数太多逐个翻页查看效率太低可以先用ERROR过滤只显示错误行ERROR屏幕上立刻只剩下包含ERROR的行后续翻页、移动都只针对这些行。这个模式对分析高并发日志特别有用能快速统计错误出现的密集度。如果需要把过滤后的内容保存下来可以在less界面按s提示输入文件名然后保存当前显示的内容。也可以退出less后用更简单的命令保存grep ERROR app.log error_only.log实际工程中更推荐后一种方式因为它直接把结果落到文件方便后续用其他工具分析。5.5 实时跟踪日志less还支持类似tail -f的实时跟踪模式。打开文件后按大写F或直接启动时使用Fless F app.log此时less会一直停留在文件末尾有新日志写入时自动滚动显示效果等同于tail -f app.log。按Ctrl C可以退出跟踪模式返回普通浏览模式按q退出整个less。这个功能在排障时很实用你先用less F实时盯日志看到有新报错后按Ctrl C然后输入/ERROR反向搜索定位整个过程不需要切换工具。6. less 高级配置与工程实践6.1 设置 LESS 环境变量每次启动less都要手动加一堆参数很麻烦可以把常用选项写进LESS环境变量。export LESS-NiMR将这一行写入~/.bashrc然后执行source ~/.bashrc之后每次执行less都会默认带上-N显示行号、-i搜索忽略大小写、-M显示详细状态、-R保留颜色。如果你不想全局设置也可以在单次命令中临时使用less -NiMR big.log6.2 让 less 成为系统默认分页器许多程序会通过PAGER环境变量调用分页器。把less设置为默认分页器后man、git diff、systemctl status等命令的输出都会自动进入less分页。export PAGERless同样可以写入~/.bashrc。不过大多数 Linux 发行版的man默认已经使用less这一步主要用于规范自己的环境。6.3 查看压缩文件日志轮转后通常会生成.gz结尾的压缩文件比如messages.1.gz。如果系统安装了gzip可以使用zless直接查看压缩日志不需要先解压zless messages.1.gzzless的交互操作和less完全一样支持搜索、翻页、跳转。如果你想在less中直接查看压缩文件也可以通过LESSOPEN环境变量配置预处理脚本但这需要依赖系统里的lesspipe工具不同发行版实现不同日常直接用zless更省事。6.4 在脚本中使用 less在 Shell 脚本中如果想给用户展示命令输出又不想输出太长导致刷屏可以用command | less -F这里的-F表示如果内容不超过一屏less自动退出不会阻塞脚本执行如果内容超过一屏则进入分页模式。这样既兼顾了完整输出又避免了短输出时还要手动按q退出的尴尬。6.5 查看日志的安全与性能建议查看大文件的本质目的是定位问题不是把整个文件从头读到尾。工程上有几个建议优先用grep、awk等命令把数据范围缩小再交给less展示。查看生产日志时保持只读操作不要误改文件权限和内容。涉及到账号、密钥、用户隐私等敏感日志注意脱敏不要直接导出到公开环境。如果日志文件达到数个 GB避免在一个终端里反复滚动建议先定位时间范围再用sed -n 开始行,结束行p提取片段。7. 常见问题与排查思路在实际使用中经常有人遇到下面这些情况这里整理成表格方便对照排查。问题现象常见原因解决办法more按b不能向上翻页more向上翻页依赖缓冲区文件内容还未读到就回不去改用less或者先继续向下浏览一部分再尝试向上翻less打开二进制文件显示乱码文件不是纯文本比如是压缩包、可执行文件用strings 文件提取可读字符串不要强行用less查看less中中文日志乱码终端编码与文件编码不一致先确认文件编码如file big.log再设置LANGzh_CN.UTF-8必要时用iconv转码方向键在less中无效终端类型不识别或环境变量TERM有误使用j、k上下移动检查echo $TERM是否正常搜索 ERROR 却搜不到默认区分大小写日志里是小写error启动时加-i忽略大小写或在less中按-再输入i回车退出less后终端一片混乱终端进入特殊模式后未恢复执行stty sane恢复终端使用reset也可以打开超大文件仍然感觉慢磁盘 I/O 慢或文件在远程挂载目录上尽量从本地复制后再查看先用grep缩小范围这里单独说一下搜索忽略大小写的问题。在less交互界面按-键底部会进入一个类似命令行的输入状态输入i再回车可以切换忽略大小写选项。这是一个比较“隐藏”的交互技巧很多老手也不一定知道但确实能在不退出less的情况下动态调整选项。8. more 和 less 对比与选择建议8.1 对比表格对比维度moreless向上翻页能力弱依赖缓冲区支持完善可自由上下翻向下搜索支持/pattern支持/pattern向上搜索不支持支持?pattern显示行号不支持-N支持跳转到指定行仅启动时num交互中可100g多文件支持较弱:n、:p切换实时跟踪不支持支持F实时跟踪颜色显示较弱-R保留颜色占用资源按需读取按需读取更优化适用场景快速浏览、精简系统日常查看、日志分析、搜索定位这个表格基本能看出less在绝大部分场景下都优于more。那more还有存在的意义吗有的。某些嵌入式系统、精简 Docker 镜像中可能只提供more此时掌握more的基础操作至少能应急。另外在脚本中如果只是想简单分页显示more的依赖更少行为也更简单直接。8.2 如何选择如果你只需要快速从上往下看一个文件不需要来回翻可以考虑more。但从长远效率和体验来看推荐直接把less作为默认的大文件查看工具。日常使用的习惯建议看配置文件、脚本源码用less -N推荐保留行号。看日志、排障定位用less -NMS结合/关键字搜索。需要实时跟踪日志用less F等价于tail -f。在管道中分页输出用command | less -F。查看压缩日志用zless。批量查看多个日志文件用less file1 file2 file3。把这些命令跑一遍其实很快不需要死记硬背只要先在上文生成的big.log上操作几次就能逐渐形成肌肉记忆。下次再面对动辄几百 MB 的日志文件时你会感谢现在花十分钟学习less的自己。