more 命令详解与参数实测(Ubuntu 22.04)

more 全参数实测:-d 键位提示、-num 每屏行数、+/pattern 跳转、-c 不滚动重绘、-s 压缩空行、h 帮助屏,伪终端录制交互回显与无 tty 整页输出边界,Ubuntu 22.04 util-linux 2.37.2 实测。

Linux命令Linux系统UbuntuUbuntu 22.04命令行文本处理2026/10/15

more 命令详解与参数实测(Ubuntu 22.04)

目标:全面掌握 more 的分页浏览能力——-d 键位提示、-num 每屏行数、+/pattern 从匹配行开始、-c 不滚动重绘、-s 压缩连续空行、交互键(空格/q/h)的真实回显、以及无 tty 管道下「直接整页输出」的边界行为,全部命令与回显已在 Ubuntu 22.04(more 属 util-linux 2.37.2)实测通过。

一、环境信息

本节记录实测环境与演示数据,便于读者对照复现。more 是经典的全屏分页器(pager):文件超过一屏时暂停并等待按键,比 cat 多了「翻页」能力,又比 less 轻量。more 的交互行为依赖终端(tty),本文对交互场景的实测采用 script 命令在伪终端下录制按键回显,环境信息里一并说明。

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • more 版本:util-linux 2.37.2(more 是 util-linux 组件,非 coreutils,见 2.3 实测)
  • 伪终端录制工具:util-linux 的 script 命令(script -qec "命令" /dev/null 在 pty 下执行命令;键盘输入经 stdin 转发,cat -v 把回显中的回车等控制符转为 ^M 可见形式)
  • 演示目录:/root/demo/more/
  • 测试数据:40 行长文本 long.txt、3 行短文件 short.txt、含连续空行的 squeeze.txt(9 行)

二、命令概览

2.1 语法与测试数据准备

帮助原文给出的语法是 more [options] <file>...,定位一句话:A file perusal filter for CRT viewing(面向 CRT 终端的文件浏览过滤器)。more 的参数分两类:改变显示行为的(-d/-c/-s/-num 等)与改变起始位置的(+行号、+/pattern);交互键(空格、回车、q、h 等)在浏览过程中按需按下。

准备演示数据——40 行长文本(超过一屏,触发分页)、3 行短文本、含连续空行的压缩演示文件:

printf "more demo line %02d\n" $(seq 1 40) > /root/demo/more/long.txt
printf "short A\nshort B\nshort C\n" > /root/demo/more/short.txt
printf "chunk A\n\n\n\nchunk B\n\n\n\nchunk C\n" > /root/demo/more/squeeze.txt

验证数据就绪——long.txt 40 行、squeeze.txt 9 行(chunk 之间各夹 3 个空行):

$ wc -l /root/demo/more/long.txt /root/demo/more/squeeze.txt
 40 /root/demo/more/long.txt
  9 /root/demo/more/squeeze.txt
 49 total

2.2 --help 全量回显

more 的帮助很短,参数一行一项,原文完整收录:


Usage:
 more [options] <file>...

A file perusal filter for CRT viewing.

Options:
 -d, --silent          display help instead of ringing bell
 -f, --logical         count logical rather than screen lines
 -l, --no-pause        suppress pause after form feed
 -c, --print-over      do not scroll, display text and clean line ends
 -p, --clean-print     do not scroll, clean screen and display text
 -s, --squeeze         squeeze multiple blank lines into one
 -u, --plain           suppress underlining and bold
 -n, --lines <number>  the number of lines per screenful
 -<number>             same as --lines
 +<number>             display file beginning from line number
 +/<pattern>           display file beginning from pattern match

 -h, --help            display this help
 -V, --version         display version

For more details see more(1).

💡 说明:注意 -c 与 -p 的原文表述——-c 是「不滚动,显示文本并清理行尾」(print-over),-p 是「不滚动,清屏后显示文本」(clean-print),两者都是抑制滚动的重绘方式、细节不同。-<number> 与 -n <number> 等价(本文用 -5 实测),+行号 与 +/pattern 控制起始位置(本文实测 +/pattern)。

2.3 版本确认

确认 more 的归属与版本:

$ more --version | head -1
more from util-linux 2.37.2

输出 more from util-linux 2.37.2——Ubuntu 22.04 里 more 来自 util-linux 而非 coreutils,与 cat/head/tail 一族不同源。

三、参数逐项实测

3.1 无 tty(管道/重定向)下直接整页输出

先明确一个重要边界:more 是交互式分页器,只有接到终端(tty)才分页。当 stdout 被管道或重定向(无 tty)时,more 退化为直接输出全部内容,且给每个文件打印 :::::: 包裹的文件名头。3 行短文件直接执行(本篇实测命令的输出均被重定向采集,即处于无 tty 状态):

$ more /root/demo/more/short.txt
::::::::::::::
/root/demo/more/short.txt
::::::::::::::
short A
short B
short C

40 行长文件过管道统计行数——43 行 = 40 行内容 + 3 行文件头:

$ more /root/demo/more/long.txt | wc -l
43

输出 43,证明无 tty 时 40 行一次性全部输出、没有任何分页暂停,只有 3 行 :::: 头。因此:把 more 接进管道(如 more 文件 | grep xx)是无意义的,等价于 cat 且多出文件头。

💡 提示:这条边界行为正是脚本里「不该用 more」的判据;交互翻页只在真终端里发生。下文 3.2 起的交互实测全部通过 script 伪终端录制。

3.2 -num:每屏行数

-N(数字直接跟在连字符后)或 -n N 设定每屏行数。先验证无 tty 时它不生效——more -5 过管道仍是全部内容:

$ more -5 /root/demo/more/long.txt | wc -l
43

输出 43(40 行内容 + 3 行头),-5 没有截断任何东西——每屏行数只在交互分页时起作用。在伪终端下录制 more -5 long.txt,按键序列为「空格翻页、q 退出」:

$ timeout 10 script -qec "more -5 /root/demo/more/long.txt" /dev/null < /root/demo/more/keys1.txt | cat -v | head -30
 qmore demo line 01^M
more demo line 02^M
more demo line 03^M
more demo line 04
more demo line 05^M
--More--(12%)^M             ^M

(注:keys1.txt 内含空格与 q 两个按键;输出行首的 q 是伪终端对键盘输入的回显,行尾 ^M 是回车符的可视化。)

逐点解读:屏幕只显示了 5 行(line 01~05),随后出现 --More--(12%) 状态提示——(12%) 表示已看内容约占全文 12%(5/40 行的屏数比例);行尾那串空格 + ^M 是 more 退出时清除状态行留下的痕迹。-5 精确生效。对照 3.3 的默认每屏 23 行(57%),-num 的作用一目了然。

💡 提示:util-linux 2.37.2 里 -5 与 -n 5 等价(帮助原文 same as --lines);+/行号 控制起始行、-num 控制每屏行数,两者可组合使用。

3.3 交互首屏与 --More-- 提示(空格翻页 / q 退出)

不带参数,在伪终端下录制 more long.txt(40 行文件、伪终端屏高 24 行,故首屏 23 行 + 状态行),按键序列仍是「空格、q」:

$ timeout 10 script -qec "more /root/demo/more/long.txt" /dev/null < /root/demo/more/keys1.txt | cat -v | head -30
 qmore demo line 01^M
more demo line 02^M
more demo line 03^M
more demo line 04^M
more demo line 05^M
more demo line 06^M
more demo line 07^M
more demo line 08^M
more demo line 09^M
more demo line 10^M
more demo line 11^M
more demo line 12^M
more demo line 13^M
more demo line 14^M
more demo line 15^M
more demo line 16^M
more demo line 17^M
more demo line 18^M
more demo line 19^M
more demo line 20^M
more demo line 21^M
more demo line 22^M
more demo line 23^M
--More--(57%)^M             ^M

首屏停在第 23 行,行尾浮现 --More--(57%)——23/40 行的屏数比例约 57%。这就是 more 的核心交互:显示一屏 → 暂停 → 等键。按空格(本例已注入)翻下一屏,按 q 退出;输入回显 q 表明这两个键已被伪终端记录并消费。

💡 提示:--More-- 状态行的完整键位语义——空格 = 下一屏、回车 = 下一行、q = 退出;3.8 的 h 帮助屏将给出官方完整键位表。

3.4 -d:显示键位提示而不是响铃

默认模式下按错键只会响铃(终端蜂鸣),-d(帮助原文 display help instead of ringing bell)改为显示提示。伪终端下录制 more -d long.txt(同样注入空格与 q):

$ timeout 10 script -qec "more -d /root/demo/more/long.txt" /dev/null < /root/demo/more/keys1.txt | cat -v | head -30
 qmore demo line 01^M
more demo line 02^M
more demo line 03^M
more demo line 04^M
more demo line 05^M
more demo line 06^M
more demo line 07^M
more demo line 08^M
more demo line 09^M
more demo line 10^M
more demo line 11^M
more demo line 12^M
more demo line 13^M
more demo line 14^M
more demo line 15^M
more demo line 16^M
more demo line 17^M
more demo line 18^M
more demo line 19^M
more demo line 20^M
more demo line 21^M
more demo line 22^M
more demo line 23^M
--More--(57%)[Press space to continue, 'q' to quit.]^M                                                    ^M

与 3.3 对照,状态行多出了 [Press space to continue, 'q' to quit.]——这正是 -d 的承诺:把「该按什么键」直接写在屏幕上。新手第一次用 more 时加 -d 可以少走弯路;按到无效键时 more 也会重复这条提示而不是干响铃。

💡 提示:-d 只影响「按键提示」的显示方式,不改变任何翻页行为;生产环境给新同事演示日志排查时,more -d 文件 比裸 more 友好得多。

3.5 +/pattern:从匹配行开始显示

+/pattern 让 more 打开文件时跳到第一个匹配行开始显示(屏幕上会先打出 ...skipping 表示跳过了前面的内容)。注意 pattern 含空格时必须整体作为一个参数传入。伪终端下录制 more "+/line 35" long.txt(按键:空格、q):

$ (printf " "; sleep 1; printf "q"; sleep 1) | timeout 10 script -qec "more \"+/line 35\" /root/demo/more/long.txt" /dev/null | cat -v | head -30
 ^M
...skipping^M
more demo line 33^M
more demo line 34^M
more demo line 35^M
more demo line 36^M
more demo line 37^M
more demo line 38^M
more demo line 39^M
more demo line 40^M

解读:...skipping 之后从 line 33 开始显示——more 定位到匹配行 35 后把这一屏的首行对齐在它前面几行处(35 号在屏内第 3 行),随后的空格键翻到文件尾(line 36~40 已在首屏内,故直接结束)。若 pattern 写成带空格却不加引号的 +/line 35,more 会把 35 当成第二个文件名而报错(实测 more: cannot open 35: No such file or directory),引号不可省。

💡 提示:+/pattern 是 POSIX 定义的 more 标准用法,vi 打开文件定位也支持同样的 +/pattern 语法;查日志时 more +/ERROR app.log 直接跳到第一个报错处。

3.6 -c:不滚动重绘

-c(帮助原文 do not scroll, display text and clean line ends)改变翻页的绘制方式:不整屏滚动,而是清理后从屏幕顶部重画。伪终端下录制 more -c long.txt(按键:空格翻页、q 退出):

$ (printf " "; sleep 1; printf "q"; sleep 1) | timeout 10 script -qec "more -c /root/demo/more/long.txt" /dev/null | cat -v | head -30
 more demo line 01^M
more demo line 02^M
more demo line 03^M
more demo line 04^M
more demo line 05^M
more demo line 06^M
more demo line 07^M
more demo line 08^M
more demo line 09^M
more demo line 10^M
more demo line 11^M
more demo line 12^M
more demo line 13^M
more demo line 14^M
more demo line 15^M
more demo line 16^M
more demo line 17^M
more demo line 18^M
more demo line 19^M
more demo line 20^M
more demo line 21^M
more demo line 22^M
more demo line 23^M
--More--(57%)^Mmore demo line 24^M
more demo line 25^M
more demo line 26^M
more demo line 27^M
more demo line 28^M
more demo line 29^M
more demo line 30^M

首屏仍是 23 行 + --More--(57%);按下空格后紧接着输出 line 24~30 的第二屏(文件已到 EOF 附近,30 行即终屏,无状态行)。录制流里 -c 与默认模式的内容一致,差异发生在终端绘制层:默认模式整屏滚动、-c 清行重绘——在真终端上能明显看出「新内容从顶部刷出」而不是「旧内容往上滚」。它对录制/管道抓取的字节流影响有限,属视觉层优化。

💡 提示:-c 的姊妹选项 -p(clean screen and display text)是「整屏清除后重画」,粒度更粗;两者都是为了降低滚动闪烁,慢终端时代尤其有用。

3.7 -s:压缩连续空行

-s(squeeze)把连续多个空行压成一个。先看 squeeze.txt 原始内容(chunk 之间各夹 3 个空行):

$ cat /root/demo/more/squeeze.txt
chunk A



chunk B



chunk C

无 tty 下 more -s 不压缩——3.1 已说明无 tty 时 more 是透传模式:

$ more -s /root/demo/more/squeeze.txt
::::::::::::::
/root/demo/more/squeeze.txt
::::::::::::::
chunk A



chunk B



chunk C

连续空行原样保留。伪终端下录制同样的命令(按键:空格、q),压缩立即生效:

$ (printf " "; sleep 1; printf "q"; sleep 1) | timeout 10 script -qec "more -s /root/demo/more/squeeze.txt" /dev/null | cat -v | head -20
 chunk A^M
^M
chunk B^M
^M
chunk C^M

chunk 之间的 3 个空行被压成 1 个,9 行文件在屏幕上只有 5 行内容。-s 是显示层参数,只在交互分页渲染时起作用。

💡 提示:要对文件本身「落盘压缩空行」,用 cat -s 源文件 > 新文件(见本专栏《cat 命令详解与参数实测(Ubuntu 22.04)》3.4 的实测);more 的 -s 只改屏幕显示,不动文件。

3.8 h:帮助屏(官方键位全表)

交互过程中按 h 可调出帮助屏。伪终端下录制 more -d long.txt,按键序列为「等首屏渲染、按 h、等 2 秒、按 q」:

$ (printf "h"; sleep 2; printf "q"; sleep 1) | timeout 10 script -qec "more -d /root/demo/more/long.txt" /dev/null | cat -v | head -60
hmore demo line 01^M
more demo line 02^M
more demo line 03^M
more demo line 04^M
more demo line 05^M
more demo line 06^M
more demo line 07^M
more demo line 08^M
more demo line 09^M
more demo line 10^M
more demo line 11^M
more demo line 12^M
more demo line 13^M
more demo line 14^M
more demo line 15^M
more demo line 16^M
more demo line 17^M
more demo line 18^M
more demo line 19^M
more demo line 20^M
more demo line 21^M
more demo line 22^M
more demo line 23^M
--More--(57%)[Press space to continue, 'q' to quit.]^M                                                    ^MMost commands optionally preceded by integer argument k.  Defaults in brackets.^M
Star (*) indicates argument becomes new default.^M
-------------------------------------------------------------------------------^M
<space>                 Display next k lines of text [current screen size]^M
z                       Display next k lines of text [current screen size]*^M
<return>                Display next k lines of text [1]*^M
d or ctrl-D             Scroll k lines [current scroll size, initially 11]*^M
q or Q or <interrupt>   Exit from more^M
s                       Skip forward k lines of text [1]^M
f                       Skip forward k screenfuls of text [1]^M
b or ctrl-B             Skip backwards k screenfuls of text [1]^M
'                       Go to place where previous search started^M
=                       Display current line number^M
/<regular expression>   Search for kth occurrence of regular expression [1]^M
n                       Search for kth occurrence of last r.e [1]^M
!<cmd> or :!<cmd>       Execute <cmd> in a subshell^M
v                       Start up '/usr/bin/vi' at current line^M
ctrl-L                  Redraw screen^M
:n                      Go to kth next file [1]^M
:p                      Go to kth previous file [1]^M
:f                      Display current file name and line number^M
.                       Repeat previous command^M
-------------------------------------------------------------------------------^M
--More--(57%)[Press space to continue, 'q' to quit.]^M                                                    ^M

帮助屏先输出两行总述(多数命令可带整数参数 k、星号表示该参数成为新默认),然后是完整键位表:空格/z 显示下一屏、回车下一行、d 半屏滚动、q/Q 退出、s/f 跳行跳屏、b 回翻屏、=/f 显示当前位置、/正则 搜索、n 搜索下一个、! 执行子命令、v 从当前行调 vi 编辑、Ctrl-L 重绘、:n/:p 多文件间跳转、. 重复上一命令。这是本文交互键位的最权威依据,全部来自实测回显而非转述。

💡 提示:键位表里的 /正则 搜索与 v 调 vi 是 more 的隐藏实力——临时用 more 排查日志时,/ERROR 回车即搜,v 直接跳进当前行编辑;记住 q(退出)与 h(求助)两个键即可放心进入 more。

四、实战示例

4.1 与 less 对照:什么时候该换 less

less 是 more 的现代继任者(Ubuntu 22.04 实装 less 590),支持前后滚动、搜索高亮、大文件秒开。确认版本:

$ less --version | head -1
less 590 (GNU regular expressions)

less 的 -N 在交互屏幕上为每行显示行号;但把 less 接进管道(无 tty)时同样退化为直接输出,-N 行号不会出现在管道结果里:

$ less -N /root/demo/more/short.txt | cat
short A
short B
short C

输出没有行号——这与 3.1 的 more 边界行为同源:分页器的参数都只在交互终端里生效。

💡 技术拓展:终端分页器的选型对比——

分页器定位代表能力
more经典轻量分页器,POSIX 标配空格翻页、+/pattern、-d 提示
less功能完备的现代分页器前后滚动、正则搜索高亮、随文件增长跟踪(+F)
most彩色/多窗口分页器多文件同屏、色块高亮

日常快看一屏选 more( ubiquitous、零学习成本);需要回滚、搜索、看大日志选 less;more 走到一半想回上一屏是短板(b 只在部分实现可用),这种场景直接换 less。

五、注意事项与常见问题

Q1:more 接在管道后面为什么输出全乱/带了 :::::: 头? 无 tty 时 more 进入透传模式:一次性输出全部内容并给每个文件打印 :::::: 文件名头(见 3.1 实测)。分页器不该出现在管道中游;管道里过滤用 grep,分页只在最终面向人的终端使用。

Q2:按了空格没反应或直接退出了? 检查两点:其一,终端窗口是否被其他程序抢占键盘;其二,more 在显示完文件最后一屏后按任意键即退出(见 3.5/3.6 实测中翻页到 EOF 的行为)——到达文件尾后按键退出属正常。想「到尾也不退出」的场景换 less。

Q3:more -5 在脚本里为什么毫无作用? -num、-c、-s 等参数都是交互渲染参数,脚本(无 tty)里 more 直接透传(见 3.2/3.7 的两组对照实测)。脚本里取「前 N 行」应该用 head,取「第 K 行起」用 tail -n +K。

Q4:+/pattern 报错 cannot open 35? pattern 里有空格且没加引号,空格后的词被当成了第二个文件名(3.5 实测了错误形态)。给 pattern 整体加引号:more "+/line 35" 文件名。

Q5:-c 与 -p 有什么区别?该用哪个? 两者都是抑制滚动的重绘方式:-c 逐行清理后从顶部画(print-over),-p 整屏清除后画(clean-print),见 2.2 帮助原文与 3.6 实测。视觉差异在慢终端上才明显,现代终端随便选,默认不设即可。

Q6:more 看到一半想编辑/搜索当前行怎么办? 按 v 从当前行启动 vi 编辑(键位表实测见 3.8),按 /正则 向下搜索、n 跳下一个匹配;这些能力 more 都有,但较 less 弱(无高亮、不可回滚)。重度的搜索/回看场景建议直接 less。

六、参考链接