当前位置: 首页 > 科技观察

你不知道的less查看文件的高级用法

时间:2023-03-13 14:58:15 科技观察

less文件查看器的一些使用技巧。最近在看ScottNesbitt的文章《在 Linux 命令行中使用 less 来查看文本文件》受到启发,所以想分享一些使用less命令的小技巧。LESS环境变量如果您定义环境变量LESS(例如在您的.bashrc中),那么less会将其视为选项列表,就好像在命令行上传递给它一样。我是这样定义的:LESS='-C-M-I-j10-#4'意思是:-C-通过不从底部滚动来加速全屏打印。-M–在最后一行(状态行)显示更多信息。你可以使用-PM来自定义显示的信息,但我通常只使用-M。-I–在搜索中忽略大小写。-j10-在终端的第10行而不是第一行显示搜索结果。这样,每次您按n或(N)跳转到下一个(或上一个)匹配项时,您就有10个上下文。-#4–当按下向右或向左箭头时,向右或向左跳转四个字符。默认情况下,它会跳半屏,我认为这太多了。总的来说,less似乎(至少部分地)针对它最初开发的环境进行了优化,调制解调器速度慢,互联网连接带宽低,因此跳过半个屏幕是有道理的。PAGER环境变量许多程序使用PAGER环境变量中的命令来显示信息。所以你可以在你的.bashrc中设置PAGER=less并让程序少运行。检查手册页(man7environ)以了解其他此类变量。-S-S告诉less剪长线而不是换行。除非我(或正在)查看文件,否则我很少需要这样做。幸运的是,您可以将所有命令行选项输入到less中,就好像它们是键盘命令一样。所以如果我想在文件已经打开时中断长行,我可以简单地键入-S。(LCTT译注:注意大写S,回车)这是我经常用的一个例子:su-postgresexportPAGER=less#因为有时候查看一个SELECT命令的When,我不需要在所有机器上编辑postgres的.bashrcpsql输出很宽,我输入-S来很好地格式化它。如果我按向右箭头查看更多,但它跳得太远(因为我没有设置-#),我可以输入-#8,每次按向右箭头都会向右移动八个字符。有时多次输入-S后,我会退出psql,设置环境变量后再次运行:exportLESS=-SF命令F可以像tail-f一样让less工作,等待更多的数据加入文件之前显示它们。与tail-f相比,它的一个优点是突出显示搜索匹配项仍然有效。所以,你可以键入less/var/log/logfile,搜索一些东西,它会突出显示所有出现的地方(除非你使用-g),然后在写入更多数据时按F记录,less会显示它并突出显示新的匹配项.按F后,可以按Ctrl+C让它停止寻找新数据(这个不会kill它),这样你就可以回到文件看旧内容,搜索其他内容等,然后再次按F查看更多新数据。搜索搜索使用系统的正则表达式库,这通常意味着您可以使用扩展的正则表达式。特别是,搜索one|two|three会找到并突出显示出现的所有one、two或three。另一种我经常使用的模式是.*someting.*,特别是对于一些非常长的日志行(例如跨越多个终端宽度的行),它会突出显示整行。此模式可以更轻松地查看线条的开始和结束位置。我还结合其他内容,比如.*onething.*|.*anotherthing.*,或者使用key:.*|.*marker.*查看key的内容。例如,日志文件包含一些字典/哈希的转储。它会突出显示相关的标记线,这样我就可以看到上下文,即使我知道该值被引用:key:'[^']*'|.*marker.*less将保留搜索词的历史记录并保存它们到磁盘以供将来召回。当您按/或?时,您可以使用向上或向下箭头浏览历史记录(并进行基本的行编辑)。在写这篇文章时,我偶然发现了less手册页,发现了一个非常有用的功能:使用&!pattern来跳过多余的行。例如,当我在/var/log/messages中查找某些内容时,我通常会一条一条地遍历以下命令:cat/var/log/messages|egrep-v'systemd:开始会话'|lesscat/var/日志/消息|egrep-v'systemd:开始会话|systemd:开始会话'|lesscat/var/日志/消息|egrep-v'systemd:StartedSession|systemd:StartingSession|UserSlice'|lesscat/var/日志/消息|egrep-v'systemd:StartedSession|systemd:StartingSession|UserSlice|dbus'|lesscat/var/日志/消息|egrep-v'systemd:StartedSession|systemd:StartingSession|UserSlice|dbus|PackageKitDaemon'|less但现在我知道如何用less做同样的事情了。例如,我可以输入&!systemd:StartedSession,然后想隐藏systemd:StartingSession,所以我输入&!并使用向上箭头从历史记录中获取我之前搜索的结果。然后我继续输入|systemd:StartingSession并按回车键,并继续以相同的方式添加更多条目,直到我过滤掉足够多的条目以查看更有趣的内容。=command=显示有关文件和位置的更多信息,甚至超过-M。如果文件非常大并且计算=花费的时间太长,您可以按Ctrl+C它将停止尝试计算。如果您正在查看的内容来自管道而不是文件,=(和-M)将不会显示未知数,包括文件中的行数和字节数。看到这个数据,如果知道pipeline命令马上就要结束了,可以用G跳到最后,less会开始显示这个信息。如果按下G并且写入管道的命令花费的时间比预期的要长,您可以按下Ctrl+C并终止该命令。即使你没有按G,Ctrl+C也会杀死它。因此,如果您不想终止命令,请不要意外按下Ctrl+C。出于这个原因,如果命令执行某些操作(不仅仅是显示信息),将其输出写入文件并在单独的终端中查看文件通常比使用管道更安全。Whyyouneedless是一个非常强大的程序,与most和moar等该领域的新竞争者不同,您可能会在几乎每个系统上找到它,就像vi一样。因此,即使您使用GUI查看器或编辑器,也值得花一些时间浏览less手册页,至少了解它的用途。这样,当您需要执行某个现有函数可能提供的操作时,您就会知道如何搜索手册页或Internet来找到您需要的东西。