more 命令详解与参数实测(Ubuntu 22.04)
more 全参数实测:-d 键位提示、-num 每屏行数、+/pattern 跳转、-c 不滚动重绘、-s 压缩空行、h 帮助屏,伪终端录制交互回显与无 tty 整页输出边界,Ubuntu 22.04 util-linux 2.37.2 实测。
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。
六、参考链接
- util-linux more 手册(more(1)):https://man7.org/linux/man-pages/man1/more.1.html
- util-linux 项目主页:https://github.com/util-linux/util-linux
- 本机帮助:
more --help、man more(Ubuntu 22.04 内置);交互内帮助:浏览中按h