我想从脚本less
中调用一个文件,并让其将输出打印到控制台,而不是新屏幕。如果文件足够短,可以放在一个屏幕上,我想禁用滚动。如果它长于一个屏幕,我希望能够滚动浏览它,但一旦到达底部,我希望将less
控制权返回到控制台。行也应该被截断(在这种情况下,丢失控制台窗口后面的字符串末尾是可以的)。
我还希望它能够凸显某种模式。
以下是我使用的参数:
less -SFXE -p "ccc" fileToShow.txt
我用-S
它来截断长行,-FX
检测文件的行数是否少于控制台,并将所有文本打印到控制台而不滚动,当到达文件末尾时-E
退出less
,适用于文本长于控制台而需要滚动的情况。
在我添加突出显示匹配的开关之前,这些都运行良好-p
。
假设 fileToShow.txt 包含以下内容:
aaa
bbb
ccc
ddd
eee
如果没有模式切换,我会得到以下结果:
[evan@localhost] $ less -SFXE fileToShow.txt
aaa
bbb
ccc
ddd
eee
[evan@localhost] $
当我添加模式匹配时,less 会打印出直到控制台高度的空行(使用波浪号显示空行)。
[evan@localhost] $ less -SFXE -p "ccc" fileToShow.txt
ccc
ddd
eee
~
~
~
~
~
~
~
~
[evan@localhost] $
有没有办法使用该-p
开关,并且在使用时不显示那些空行-F
?(注意:“ccc”行按需要突出显示,我只是有这个意想不到的副作用。)
我的shell是bash 3.2.25
,我的less版本是436
。操作系统是RHEL。
答案1
以下命令可以封装在批处理文件中:
grep --color=always -E "^|$2" "$1"|less -SFXER
参数$1
是文件名,$2
是搜索模式。注意事项:
grep -E
(或egrep
)允许匹配多个搜索模式;- 匹配到
^
(行首)确保列出每一行; - 匹配
$2
会导致搜索字符串被突出显示; grep --color=always
将突出显示的转义序列复制到管道;less -R
重现less
突出显示而不是显示转义序列。
这不是最完美的解决方案,但也是某种答案。请注意,该命令将列出所有行,突出显示模式,而less -p
忽略第一个匹配项之前的行:要重现此情况,您需要使用sed
。
答案2
还有另一种方法,全部投入less
。不过,它涉及几个步骤。
less fileToShow.txt
- 命中
&ccc
(假设ccc
是您要寻找的模式)。来自手册页:&pattern: Display only lines which match the pattern; lines which do not match the pattern are not displayed. If pattern is empty (if you type & immediately followed by ENTER), any filtering is turned off, and all lines are displayed. While filtering is in effect, an ampersand is displayed at the beginning of the prompt, as a reminder that some lines in the file may be hidden. Certain characters are special as in the / command: ^N or ! Display only lines which do NOT match the pattern. ^R Don't interpret regular expression metacharacters; that is, do a simple textual comparison.
- 最后,按F恢复拖尾
答案3
虽然不是完全的解决方案,但有一些改进-p
...
这些依赖于灵活的+
标志:
如果命令行选项以 开头
+
,则该选项的其余部分将被视为较少的。例如,+G
告诉 较少的 从文件末尾而不是开头开始,并+/xyz
告诉它从文件中第一次出现“xyz”的地方开始。作为特殊情况,它的+<number>
作用类似于+<number>g
;也就是说,它从指定的行号开始显示(但是,请参阅上面“g”命令下的警告)。如果选项以 开头++
,则初始命令适用于正在查看的每个文件,而不仅仅是第一个文件。+
前面描述的命令也可用于设置(或更改)每个文件的初始命令。
-p
跳到第一个匹配项(或者如果使用 则跳到匹配项之前的几行--jump-target
)。这不是我想要的,结合短时间退出 — 跳过的行甚至不是终端的回滚!
如果你启动
less
然后进行交互搜索/ccc
,less 会先从头开始显示行,然后才滚动,所以它们会成为终端回滚缓冲区的一部分。我们可以使用来模拟,+
但我们需要使用以下方法明确请求重新绘制r
:env LESS= less -SFXE +r/ccc fileToShow.txt
这仍然会滚动到该
ccc
行,但现在aaa
和bbb
至少位于回滚缓冲区中。但是,如果搜索跳过了很多行:seq 1000 | less -SFXE +r/980
回滚将显示类似以下内容:
48 49 50 ...skipping... 980 981 982
我预计这将可以通过 进行调整
--max-back-scroll
,但它似乎不会影响搜索。编辑:它似乎取决于窗口大小,即它填满一个屏幕,然后跳过。谁说我不想看第一行?如果我只想突出显示匹配项,我可以使用空匹配技巧:
less -SFXE '+r/ccc|$' fileToShow.txt
但这会破坏使用n/ 的导航N。最好在
/
搜索时使用此标志:如果在模式的开头输入某些字符,则它们很特殊;它们会修改搜索类型而不是成为模式的一部分:
...- ^K 突出显示当前屏幕上与模式匹配的任何文本,但不要移动到第一个匹配项(保持当前位置)。
包含 char 的语法Ctrl+K取决于 shell,在 bash 中这是有效的:
less -SFXE $'+r/\cKccc' fileToShow.txt
~
无论哪种方式,从第一行开始也会减少填充屏幕的数量