Linux 中 less 文本文件查看器的高级用法

了解更多使用 less 命令行文本文件查看器的技巧和窍门。
360 位读者喜欢这篇文章。
System statistics with sar and the /proc filesystem

ajmexico。由 Jason Baker 修改。CC BY-SA 2.0。

我最近阅读了 Scott Nesbitt 的文章“在 Linux 命令行使用 less 查看文本文件”,并受到启发,分享我使用 less 的其他技巧和窍门。

LESS 环境变量

如果您定义了环境变量 LESS(例如,在您的 .bashrc 中),less 会将其视为选项列表,就像在命令行中传递一样。

我使用这个

LESS='-C -M -I -j 10 -# 4'

这些意味着

  • -C – 通过不从底部滚动来加快全屏重绘速度。
  • -M – 从最后一行(状态行)显示更多信息。您可以使用 -PM 自定义显示的信息,但我通常不费心。
  • -I – 在搜索中忽略字母大小写(大写/小写)。
  • -j 10 – 在终端的第 10 行显示搜索结果,而不是第一行。这样,每次您按 n(或 N)跳转到下一个(或上一个)匹配项时,您都有 10 行上下文。
  • -# 4 – 按向右或向左箭头键时,向右或向左跳四个字符。默认值是跳半个屏幕,我通常觉得太多了。一般来说,less 似乎(至少部分地)针对最初开发的慢速调制解调器和低带宽互联网连接环境进行了优化,当时跳半个屏幕是有意义的。

PAGER 环境变量

许多程序使用 PAGER 环境变量(如果已设置)中设置的命令来显示信息。因此,您可以在 .bashrc 中设置 PAGER=less,并让您的程序运行 less。查看 man page environ(7) (man 7 environ) 以了解其他此类变量。

-S

命令行选项 -S 告诉 less 裁剪长行而不是换行。除非(并且直到)我开始查看文件,否则我很少发现需要这样做。幸运的是,您可以在 less 中键入所有命令行选项,就像它们是键盘命令一样。因此,如果我想在已经在一个文件中时裁剪长行,我可以简单地键入 -S

这是一个我经常使用的例子

    su - postgres
    export PAGER=less  # Because I didn't bother editing postgres' .bashrc on all the machines I use it on
    psql

有时,当我稍后查看具有非常宽输出的 SELECT 命令的输出时,我键入 -S 以便它能被很好地格式化。如果当我按向右箭头查看更多内容时跳转得太远(因为我没有设置 -#),我可以键入 -#8,然后每次按向右箭头都会向右移动八个字符。

有时在键入 -S 太多次后,我退出 psql 并再次运行它,输入

export LESS=-S

F

命令 F 使 lesstail -f 一样工作——等待更多数据添加到文件后再显示它。它比 tail -f 的一个优势是高亮显示搜索匹配项仍然有效。因此,您可以输入 less /var/log/logfile,搜索一些内容——这将高亮显示它的所有出现(除非您使用了 -g)——然后按 F。当更多数据写入日志时,less 将显示它并高亮显示新的匹配项。

在您按 F 后,您可以按 Ctrl+C 停止它查找新数据(这不会杀死它);回到文件中查看旧内容,搜索其他内容等等;然后再次按 F 查看更多新数据。

搜索

搜索使用系统的 regexp 库,这通常意味着您可以使用扩展正则表达式。特别是,搜索 one|two|three 将查找并高亮显示 one、two 或 three 的所有出现。

我经常使用的另一种模式,特别是对于宽日志行(例如,跨越多行终端行的日志行),是 .*something.*,它会高亮显示整行。这种模式使查看行的开始和结束位置变得更加容易。我也结合使用这些,例如:.*one thing.*|.*another thing.*,或 key: .*|.*marker.* 以查看 key 的内容(例如,在包含一些字典/哈希转储的日志文件中)并高亮显示相关的标记行(以便我有一个上下文),甚至,如果我知道值被引号包围

key: '[^']*'|.*marker.*

less 维护您的搜索项的历史记录,并将其保存到磁盘以供将来调用。当您按 /(或 ?)时,您可以使用向上或向下箭头浏览此历史记录(以及进行基本的行编辑)。

在撰写本文时,我偶然发现了一个似乎非常有用的功能,即在浏览 less 手册页时:使用 &!pattern 跳过不感兴趣的行。例如,在 /var/log/messages 中查找某些内容时,我过去会迭代以下命令列表

    cat /var/log/messages | egrep -v 'systemd: Started Session' | less
    cat /var/log/messages | egrep -v 'systemd: Started Session|systemd: Starting Session' | less
    cat /var/log/messages | egrep -v 'systemd: Started Session|systemd: Starting Session|User Slice' | less
    cat /var/log/messages | egrep -v 'systemd: Started Session|systemd: Starting Session|User Slice|dbus' | less
    cat /var/log/messages | egrep -v 'systemd: Started Session|systemd: Starting Session|User Slice|dbus|PackageKit Daemon' | less

但现在我知道如何在 less 中做同样的事情。例如,我可以键入 &!systemd: Started Session,然后决定我想去掉 systemd: Starting Session,所以我通过键入 &! 添加它,并使用向上箭头从历史记录中获取之前的搜索。然后我键入 |systemd: Starting Session 并按 Enter,继续以相同的方式添加更多项目,直到我过滤掉足够多的内容以查看更有趣的内容。

=

命令 = 显示有关文件和位置的更多信息,甚至比 -M 更多。如果文件非常长,并且计算 = 花费的时间太长,您可以按 Ctrl+C,它将停止尝试。

如果您查看的内容来自管道而不是文件,=(和 -M)将不会显示它不知道的内容,包括文件中的行数和字节数。要查看该数据,如果您知道 command 将很快完成,您可以按 G 跳转到末尾,然后 less 将开始显示该信息。

如果您按 G 并且写入管道的命令花费的时间比预期的长,您可以按 Ctrl+C,命令将被终止。即使您没有按 G,按 Ctrl+C 也会终止它,因此如果您不打算终止它,请小心不要意外按 Ctrl+C。因此,如果命令执行某些操作(即,它不仅仅是显示信息),通常更安全的方法是将它的输出写入文件,并在单独的终端中查看文件,而不是使用管道。

为什么你需要 less

less 是一个非常强大的程序,与该领域较新的竞争者(如 mostmoar)相反,您很可能在几乎所有您使用的系统上找到它,就像 vi 一样。因此,即使您使用 GUI 查看器或编辑器,也值得花一些时间浏览 less 手册页,至少了解一下有哪些可用功能。这样,当您需要执行某些可能被现有功能覆盖的操作时,您就会知道搜索手册页或互联网以查找您需要的内容。

有关更多信息,请访问 less 主页。该网站有一个很好的 FAQ,其中包含更多技巧和窍门。

User profile image.
Didi 在决定实际想成为系统管理员之前,曾短暂担任了 2 年的开发人员,之后他花了 15 年以上的时间担任系统管理员。然后他决定再次跨界,现在是 Red Hat 的开发人员,在 oVirt 项目的集成开发团队工作。

8 条评论

这里的信息很棒。我得试试其中的一些!

我不知道的好东西。与使用编辑器相比,less 的一个主要优点是文件应该受到保护,不会被更改,但默认情况下并非如此。我将环境变量 LESSEDIT 设置为无害的东西,例如“/bin/false”以禁用“v”编辑功能,或者更彻底地,设置 LESSSECURE=1 以防止编辑和 shell 转义。这样您就可以避免键盘错误。

没错,谢谢您的评论。

如果我想格外确定 less 不会接触到文件,我通常会使用 'less < $FILE'。

顺便说一句,相反的情况,即能够在 vi 中打开 stdin(即使您精通 'less' 也可能很有用),是:'$COMMAND | vi -'。一些较旧/较简单的 VI 无法处理此问题,但 VIM 可以——至少在 5-10 年左右,没有检查过。但是,如果您想从 'less' 内部执行此操作怎么办?例如,您运行了 '$COMMAND | less',现在想用 vi 打开它?如果您按 'v',它会告诉您 '无法编辑标准输入'。相反,按 'g'(转到顶部),'|'(管道),'$'(文件结束标记),'vi -'(然后按 Enter)。

回复 作者:Donald Arseneau (未验证)

我的一些技巧。可以使用许多 vi 命令。
1. 按 k 或 j 上下移动一行
2. 按 CTRL+d 或 CTRL+u 上下移动半屏
3. 按 v 启动默认编辑器,如 vi。注意:在 Ubuntu 上使用以下命令设置默认编辑器:sudo update-alternatives --config editor
4. 跳转到文件第一行:gg
5. 跳转到文件最后一行:G
6. 滚动到文件中间,创建一个标记:ma,向下/向上移动,然后使用:'a 跳回标记行
7. 在第 100 行打开 less:less +100 file
8. 在文件底部打开文件(默认在顶部):less +G file
9. 退出 less 时,将文本留在屏幕上:less -X file
10. 在左侧显示行号:less -N file
11. 如果您打开多个文件:less file1 file2 file3,然后在文件之间移动::n 和 :p 用于上一个,:d 用于从 less 显示中删除文件

最重要的呢?在 less 内部按“h”获取帮助。:))

这很重要:如果您使用 Git 并计划使用这些想法,您必须在您的别名中包含 -R 选项,否则它会使您的 git 输出无法阅读。我什至会更进一步说这必须出现在文章本身中,因为用户可能不会立即将损坏的 Git 输出与他们刚刚对 pager 所做的更改联系起来。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.