在读取带有“少”或“更多”的文件时,如何获得彩色内容?


415

当我使用less或命令在Linux中读取文件时more,如何获得彩色内容?



7
这个问题的标题很容易引起误解。很多人登陆这个页面上希望解决着色问题时,你会得到管道将命令与彩色输出less:颜色都将丢失。(该“管道问题”的答案涉及less -Runbuffer等等),但实际的问题,指的是打开一个文件!—模糊性主要在于问题的标题,但除此之外,恕我直言,问题仍然太笼统:“读取文件”可以指代任何文件(可能是纯文本)。(好吧,“获取颜色内容”可能是指语法突出显示。)
myrdd

我需要纠正自己,在14个答案中只有3个(或4个)缺少OP的实际问题:ChristopheDPuneetOnlyjob的答案;也许是jbbr。尽管如此,其中两个答案还是三个投票最高的答案的一部分。
myrdd '18

@myrdd“语法高亮”是相关的术语……(它询问显示颜色,而不是添加颜色?)less -R也可以在文件上使用,例如ls --color=always > /tmp/file && less -R /tmp/file
Gert van den Berg

1
@myrdd将问题以“不清楚所要询问的内容”来结束可能是最有意义的,因为询问两个问题中的任何一个都可能被标记为重复的问题...(并且两个问题中的任何一个都可以被否决。基于投票者的解释方式...)(我的用例是一个日志文件,(讨厌地)其中包含颜色转义代码)
Gert van den Berg

Answers:


149

您可以更少地利用pygmentize的功能-自动!(无需手动管道。)

pygments使用包管理器或pip(可能称为python-pygments)安装,或在http://pygments.org/download/中获取。

写一个文件 ~/.lessfilter

#!/bin/sh
case "$1" in
    *.awk|*.groff|*.java|*.js|*.m4|*.php|*.pl|*.pm|*.pod|*.sh|\
    *.ad[asb]|*.asm|*.inc|*.[ch]|*.[ch]pp|*.[ch]xx|*.cc|*.hh|\
    *.lsp|*.l|*.pas|*.p|*.xml|*.xps|*.xsl|*.axp|*.ppd|*.pov|\
    *.diff|*.patch|*.py|*.rb|*.sql|*.ebuild|*.eclass)
        pygmentize -f 256 "$1";;

    .bashrc|.bash_aliases|.bash_environment)
        pygmentize -f 256 -l sh "$1";;

    *)
        if grep -q "#\!/bin/bash" "$1" 2> /dev/null; then
            pygmentize -f 256 -l sh "$1"
        else
            exit 1
        fi
esac

exit 0

在您的.bashrc添加中

export LESS='-R'
export LESSOPEN='|~/.lessfilter %s'

另外,您需要~/.lessfilter通过运行来使可执行文件

chmod u+x ~/.lessfilter

在Debian上测试。

你明白了。当然,这可以进一步改进,接受更多扩展或解析shebang而不是bash来解释其他解释器。看到其他一些答案。

这个想法来自Pygments制造商的一个旧博客帖子,但是原来的帖子不再存在。


6
如果要对源代码文件进行着色,还需要通过运行使〜/ .lessfilter可执行chmod u+x ~/.lessfilter。您还需要安装pygmentize(pygments.org/download)。
Sergiy Belozorov

当我执行ls -l | less
puk

7
@puk你可以做类似的事情ls --color=always -l | less -R。显然要键入很多,但您可以将其别名为ll。那就是如果您不想使用任何额外的库。
PhilT 2014年

2
在答案中添加了@SergiyByelozyorov的评论。
andrybak

2
我的编辑被拒绝了,所以我想我将其发布为注释:不要间接测试命令的退出代码。您可以使用if grep -q "#\!/bin/bash" "$1"-q禁止显示标准输出)。您可能需要使用重定向标准错误2>/dev/null
Tom Fenech

503

请尝试以下操作:

less -R

来自man less

-r 要么 --raw-control-chars

导致显示“原始”控制字符。(...)

-R 要么 --RAW-CONTROL-CHARS

与相似-r,但仅以“原始”形式输出ANSI“颜色”转义序列。(...)


16
当文件本身包含需要显示的转义码时,此功能很有用。
Nitrodist

1
我以前对-r不太了解,但是使用“ /”搜索文件时总是出现错误的行。-R似乎做得更好。谢谢你的提示。
阿莫斯·夏皮拉

54
应当注意,大多数程序使用isatty(2)syscall来检查其标准输出是否为终端,如果不是,则通常禁用彩色输出。对于小于该值的任何管道,isatty将返回0。要检查是否echo -e '\x1b[32;1mtest\x1b[m' | less -r
可行

11
这个答案在实际测试中并不出色。
Michael Wolf

18
您也可以-R在已打开时键入less以实现此目的。
Scz 2016年

138

我在另一篇文章中得到了答案:Less and Grep:使用从grep到less的管道时获得彩色结果

当您简单运行时,grep --color它暗示着grep --color=auto哪个会检测输出是否为终端,如果是,则启用颜色。但是,当它检测到管道时,它将禁用着色。以下命令:

grep --color=always "search string" * | less -R

将始终启用着色并覆盖自动检测,并且您将获得较少的颜色突出显示。

警告:不要将其--color=always作为别名,它有时会破坏事情。这就是为什么有一个--color=auto选择。


6
很好,谢谢。除了我也需要将其-R用作的选项less
naught101

10
我相信grep -R是用于指定递归搜索。less -Rless正确吐出颜色所必需的。grep --color=always [grep cmds] | less -R在OS X 10.7.3上对我有效!
史蒂文·卢

@ naught101 @Steven Lu编辑,尽管似乎有些人可能不需要使用less -R(无论如何,根据原始帖子的作者)。
jtpereyda

2
无论如何,有什么要让grep知道少用管道-R命令然后再进行着色?因此,我们不必一直都放--color = always和更少的-R。
A休息室

1
这是迄今为止最简单的工作答案。谢谢!
Danny Staple

36

使用view代替less。它vim以只读模式打开文件。

它实际上是彩色的less:您可以使用/(以及更多)进行搜索的寻呼机。唯一的缺点是您不能退出,q但需要:q

另外,您得到的颜色与vim(因为您实际上正在使用vim)相同。


大文件的性能如何?Vim语法高亮显示在大文件上速度很慢。
pihentagy 2014年

我不知道“大”的价值是什么,但是打开〜10000行文件是即时的,包括在内部搜索。
Riccardo Galli 2014年

1
我赞成(我不知道view),但是另一个缺点是j / k / up / down不会立即滚动,因为有光标。
Tyler Collier'3

7
请注意,view -在管道连接时可能需要添加
user45909

6
vim是一个编辑器,它将整个文件加载到内存中,而是less一个寻呼机,将文件仅部分加载到内存中。您将了解大型文件的区别。
sjas's

16

为了减少显示颜色,请使用-R进行调用:

less -R

不幸的是,某些程序检测到其stdout不是终端并禁用颜色,例如pacman(Arch Linux程序包管理器)。

在这种情况下,可以使用unbuffer

unbuffer <command> | less -R

使用pacman的示例

unbuffer pacman -Ss firefox | less -R

unbuffer命令通常是软件包的一部分expect(Arch Linux,Debian / Ubuntu)或expect-dev(旧版本的Debian / Ubuntu)。

要回答完整性问题:

正如其他人已经回答的那样,pygmentize它非常适合为源代码着色。它不需要unbuffer。最简单的电话:

pygmentize someSource.cpp | less -R

2
unbuffer在Ubuntu上使用,sudo apt install expect
wisbucky

这个答案需要更多的投票。
Thomas Dignan

我试图通过管道dmesg输出来检查启动错误,但是除非使用unbuffer,否则颜色将不起作用,这使我感到困惑:unbuffer dmesg | less -R按预期工作。
pbhj

15

pygmentize支持-g自动猜测要使用的词法分析器的选项,该选项对于STDIN无需检查任何扩展名类型即可读取的文件很有用。

使用它,您只需要在您的服务器中设置以下2个导出,.bashrc而无需任何其他脚本:

export LESS='-R'
export LESSOPEN='|pygmentize -g %s'

4
简洁有效。我更喜欢定义别名,因为有时少一些更好。因此:alias lesc ='LESS =“-R” LESSOPEN =“ | pygmentize -g%s” less'–
Tiago

9

您没有说这种颜色是什么意思,例如,文本文件的颜色应该是什么?

如果要对源代码进行语法突出显示,则需要一个源代码突出显示器。我有时会像这样使用pygmentize

pygmentize file.cpp | less

要么

pygmentize file.cpp | more

周围还有其他荧光笔。

这非常快。如果您不介意启动,vim则有一个只读模式,如果您有,它可以为您突出显示语法vim

view file.cpp

或者,请参阅churnd的答案。


5

这是另一个基于pygments的答案,具有一些重大改进:

  • 不会破裂lesspipelessfile过滤
  • 与多个输入一起使用 less
  • 从shebang标头中正确解析脚本类型
  • 适用于Pygments可分类的所有434种文件类型
  • 将配色方案参数化为环境变量

安装Pygments和Gawk

sudo apt-get install python-pygments python3-pygments gawk

设置环境变量

检查是否lesspipelessfile已经启用:

echo $LESSOPEN

如果您在此处看不到引用的任何程序,请确保lesspipe已安装该程序(大多数发行版均随附)。

将以下内容添加到~/.bashrc

# sets LESSOPEN and LESSCLOSE variables
eval "$(SHELL=/bin/sh lesspipe)"

# interpret color characters
export LESS='-R'

# to list available styles: `pygmentize -L styles`
export PYGMENTIZE_STYLE='paraiso-dark'

# optional
alias ls='ls --color=always'
alias grep='grep --color=always'

如果您不想要lesspipe,请将该eval语句替换为:

export LESSOPEN='|~/.lessfilter %s'

创造 ~/.lessfilter

添加以下代码并使文件可执行: chmod u+x ~/.lessfilter

#!/bin/bash
for path in "$@"; do
    # match by known filenames
    filename=$(basename "$path")
    case "$filename" in
        .bashrc|bash.bashrc|.bash_aliases|.bash_environment|.bash_profile|\
        .bash_login|.bash_logout|.profile|.zshrc|.zprofile|.zshrc|.zlogin|\
        .zlogout|zshrc|zprofile|zshrc|zlogin|zlogout|.cshrc|.cshdirs|\
        csh.cshrc|csh.login|csh.logout|.tcshrc|.kshrc|ksh.kshrc)
            # shell lexer
            pygmentize -f 256 -O style=$PYGMENTIZE_STYLE -l sh "$path"
            ;;
        .htaccess|apache.conf|apache2.conf|Dockerfile|Kconfig|external.in*|\
        standard-modules.in|nginx.conf|pacman.conf|squid.conf|termcap|\
        termcap.src|terminfo|terminfo.src|control|sources.list|CMakeLists.txt|\
        Makefile|makefile|Makefile.*|GNUmakefile|SConstruct|SConscript|\
        .Rhistory|.Rprofile|.Renviron|Rakefile|Gemfile|PKGBUILD|autohandler|\
        dhandler|autodelegate|.vimrc|.exrc|.gvimrc|vimrc|exrc|gvimrc|todo.txt)
            # filename recognized
            pygmentize -f 256 -O style=$PYGMENTIZE_STYLE "$path"
            ;;
        *)
            ext=$([[ "$filename" = *.* ]] && echo ".${filename##*.}" || echo '')
            case "$ext" in
                .as|.mxml|.bc|.g|.gd|.gi|.gap|.nb|.cdf|.nbp|.ma|.mu|.at|.run|\
                .apl|.adl|.adls|.adlf|.adlx|.cadl|.odin|.c-objdump|.s|\
                .cpp-objdump|.c++-objdump|.cxx-objdump|.d-objdump|.S|.hsail|\
                .ll|.asm|.ASM|.objdump-intel|.objdump|.tasm|.au3|.ahk|.ahkl|\
                .bb|.decls|.bmx|.bas|.monkey|.BAS|.bst|.bib|.abap|.ABAP|.cbl|\
                .CBL|.cob|.COB|.cpy|.CPY|.gdc|.maql|.p|.cls|.c|.h|.idc|.cpp|\
                .hpp|.c++|.h++|.cc|.hh|.cxx|.hxx|.C|.H|.cp|.CPP|.ino|.clay|\
                .cu|.cuh|.ec|.eh|.mq4|.mq5|.mqh|.nc|.pike|.pmod|.swg|.i|.vala|\
                .vapi|.capnp|.chpl|.icl|.dcl|.cf|.docker|.ini|.cfg|.inf|\
                .pc|.properties|.reg|.tf|.pypylog|.cr|.csd|.orc|.sco|.css|\
                .less|.sass|.scss|.croc|.d|.di|.smali|.jsonld|.json|.yaml|\
                .yml|.dpatch|.darcspatch|.diff|.patch|.wdiff|.boo|.aspx|.asax|\
                .ascx|.ashx|.asmx|.axd|.cs|.fs|.fsi|.n|.vb|.als|.bro|.crmsh|\
                .pcmk|.msc|.pan|.proto|.pp|.rsl|.sbl|.thrift|.rpf|\
                .dylan-console|.dylan|.dyl|.intr|.lid|.hdp|.ecl|.e|.elm|.ex|\
                .exs|.erl|.hrl|.es|.escript|.erl-sh|.aheui|.befunge|.bf|.b|\
                .camkes|.idl4|.cdl|.cw|.factor|.fan|.flx|.flxh|.frt|.f|.F|\
                .f03|.f90|.F03|.F90|.PRG|.prg|.go|.abnf|.bnf|.jsgf|.cyp|\
                .cypher|.asy|.vert|.frag|.geo|.plot|.plt|.ps|.eps|.pov|.inc|\
                .agda|.cry|.hs|.idr|.kk|.kki|.lagda|.lcry|.lhs|.lidr|.hx|\
                .hxsl|.hxml|.sv|.svh|.v|.vhdl|.vhd|.dtd|.haml|.html|.htm|\
                .xhtml|.xslt|.pug|.jade|.scaml|.xml|.xsl|.rss|.xsd|.wsdl|\
                .wsf|.xpl|.pro|.ipf|.nsi|.nsh|.spec|.i6t|.ni|.i7x|.t|.io|\
                .ijs|.coffee|.dart|.eg|.js|.jsm|.juttle|.kal|.lasso|\
                .lasso[89]|.ls|.mask|.j|.ts|.tsx|.jl|.aj|.ceylon|.clj|\
                .cljs|.golo|.gs|.gsx|.gsp|.vark|.gst|.groovy|.gradle|.ik|\
                .java|.kt|.pig|.scala|.xtend|.cpsa|.cl|.lisp|.el|.hy|.lsp|.nl|\
                .kif|.rkt|.rktd|.rktl|.scm|.ss|.shen|.xtm|.cmake|.mak|.mk|\
                .[1234567]|.man|.md|.css.in|.js.in|.xul.in|.rst|.rest|.tex|\
                .aux|.toc|.m|.sci|.sce|.tst|.ml|.mli|.mll|.mly|.opa|.sml|.sig|\
                .fun|.bug|.jag|.mo|.stan|.def|.mod|.mt|.ncl|.nim|.nimrod|.nit|\
                .nix|.cps|.x|.xi|.xm|.xmi|.mm|.swift|.ooc|.psi|.psl|.G|.ebnf|\
                .rl|.treetop|.tt|.adb|.ads|.ada|.pas|.dpr|.pwn|.sp|.pl|.pm|\
                .nqp|.p6|.6pl|.p6l|.pl6|.6pm|.p6m|.pm6|.php|.php[345]|.zep|\
                .praat|.proc|.psc|.lgt|.logtalk|.prolog|.pyx|.pxd|.pxi|.dg|\
                .py3tb|.py|.pyw|.sc|.tac|.sage|.pytb|.qvto|.Rout|.Rd|.R|.rq|\
                .sparql|.ttl|.r|.r3|.reb|.red|.reds|.txt|.rnc|.graph|\
                .instances|.robot|.fy|.fancypack|.rb|.rbw|.rake|.gemspec|\
                .rbx|.duby|.rs|.rs.in|.SAS|.sas|.applescript|.chai|.ezt|\
                .mac|.hyb|.jcl|.lsl|.lua|.wlua|.moo|.moon|.rexx|.rex|.rx|\
                .arexx|.sh|.ksh|.bash|.ebuild|.eclass|.exheres-0|.exlib|.zsh|\
                .sh-session|.shell-session|.bat|.cmd|.fish|.load|.ps1|.psm1|\
                .tcsh|.csh|.ns2|.st|.smv|.snobol|.rql|.sql|.sqlite3-console|\
                .do|.ado|.scd|.tcl|.rvt|.ng2|.tmpl|.spt|.cfc|.cfm|.cfml|\
                .evoque|.kid|.handlebars|.hbs|.phtml|.jsp|.liquid|.mao|.mhtml|\
                .mc|.mi|.myt|.rhtml|.tpl|.ssp|.tea|.twig|.vm|.fhtml|.sls|\
                .feature|.tap|.awk|.vim|.pot|.po|.weechatlog|.todotxt|.thy|\
                .lean|.rts|.u|.vcl|.bpl|.sil|.vpr|.cirru|.duel|.jbst|.qml|\
                .qbs|.slim|.xqy|.xquery|.xq|.xql|.xqm|.whiley|.x10)
                    # extension recognized
                    pygmentize -f 256 -O style=$PYGMENTIZE_STYLE "$path"
                    ;;
                *)
                    # parse the shebang script header if it exists
                    lexer=$(head -n 1 "$path" |grep "^#\!" |awk -F" " \
'match($1, /\/(\w*)$/, a) {if (a[1]!="env") {print a[1]} else {print $2}}')
                    case "$lexer" in
                        node|nodejs)
                            # workaround for lack of Node.js lexer alias
                            pygmentize -f 256 -O style=$PYGMENTIZE_STYLE \
                                -l js "$path"
                            ;;
                        "")
                            exit 1
                            ;;
                        *)
                            pygmentize -f 256 -O style=$PYGMENTIZE_STYLE \
                                -l $lexer "$path"
                            ;;
                    esac
                    ;;
            esac
            ;;
    esac
done
exit 0

这种方法的一个缺点是Pygments是Python程序,因此在shell会话期间首次使用时,会出现“冷启动”延迟。随后的调用要快得多。
乔·编码员

真好!真的很全面。
Dario Seidl '18

4

使用GNU Source-highlight;您可以使用它来安装它,也可以apt通过源代码进行安装。然后设置“输入预处理”少,使用源-highligh”单证的帮助较少的设置

康斯坦丁·塞勒布里亚尼(Konstantine Serebriany)提出了这一建议。脚本src-hilite-lesspipe.sh将与source-highlight一起安装。您可以使用以下环境变量:

 export LESSOPEN="| /path/to/src-hilite-lesspipe.sh %s"
 export LESS=' -R '

这样,当您较少使用浏览文件时,如果它是由source-highlight处理的源文件,它将自动突出显示。

Xavier-Emmanuel Vincent最近提供了另一种ANSI配色方案esc256.style:某些终端可以处理256种颜色。Xavier还提供了一个脚本,用于检查终端可以处理多少种颜色,以及是否使用256种颜色。该脚本称为source-highlight-esc.sh,它将与其他二进制文件一起安装。


3

要扩展另一个答案,只需稍微更改一下.lessfilter文件,即可使其对大多数没有扩展名的脚本都有效:

#!/bin/sh
    case "$1" in
    *.awk|*.groff|*.java|*.js|*.m4|*.php|*.pl|*.pm|*.pod|*.sh|\
    *.ad[asb]|*.asm|*.inc|*.[ch]|*.[ch]pp|*.[ch]xx|*.cc|*.hh|\
    *.lsp|*.l|*.pas|*.p|*.xml|*.xps|*.xsl|*.axp|*.ppd|*.pov|\
    *.diff|*.patch|*.py|*.rb|*.sql|*.ebuild|*.eclass)
        pygmentize -f 256 "$1";;
    .bashrc|.bash_aliases|.bash_environment)
        pygmentize -f 256 -l sh "$1"
        ;;
    *)
        scriptExec=$(head -1 "$1" |grep "^#\!" |awk -F" " '{print $1}')
        scriptExecStatus=$?
        if [ "$scriptExecStatus" -eq "0" ]; then
            lexer=$(echo $scriptExec |awk -F/ '{print $NF}')
            pygmentize -f 256 -l $lexer "$1"
        else
            exit 1
        fi
esac

exit 0

您仍然需要将两个变量添加到.bashrc中:

export LESS='-R'
export LESSOPEN='|~/.lessfilter %s'

而且您仍然需要使.lessfilter可执行:

$ chmod 700 ~/.lessfilter

我还想补充一点,在debian下pygments包称为python-pygments。起初我很难找到它,因为“色素”作为“色素”的明显拼写错误不足以向我暗示它是一个软件包管理器可能以“ python-”为前缀的软件包。


2
2条评论:1)感谢您的改进。2)诸如“投票最佳答案”之类的词不是很好;可能会改变(实际上,如果这比那个答案更好,则帖子可能会成为最佳答案,这时它会令人困惑。也许只是说“扩展到另一个答案”或“ captaincomic的答案”?
cpast

2

您可以考虑使用most的工具,它是彩色友好的替代lessmore


能给我们举个例子吗?我在这里尝试过,输出是黑白的。
丹尼洛

您的输入应包含颜色。第一产生colorised样品(例如ccze -A </var/log/dpkg.logls -1 --color /var/log),则管它mostls -1 --color /var/log | most
Onlyjob

是的,我用:git status | less --colorgit status | most --color
达尼罗-

我使用了更多,更少,而且所有工具都显示为黑色和白色
danilo

传递给less其他对象之前,请确保您的命令产生颜色。确保您的终端仿真器可以输出颜色。检查TERM环境变量。在unix.stackexchange.com/questions/148/中了解更多信息。如有可能,请使用Debian等现代GNU + Linux发行。使用搜索引擎(例如duckduckgo.com startpage.com)来找到答案。请记住,评论不用于讨论。
Onlyjob

2

浓缩于我的全文博客,内容涉及减少经验:https : //www.topbug.ne​​t/blog/2016/09/27/make-gnu-less-more-powerful/

对于彩色手册页,将以下内容添加到您的.bashrc或中.zshrc

export LESS_TERMCAP_mb=$'\E[1;31m'     # begin bold
export LESS_TERMCAP_md=$'\E[1;36m'     # begin blink
export LESS_TERMCAP_me=$'\E[0m'        # reset bold/blink
export LESS_TERMCAP_so=$'\E[01;44;33m' # begin reverse video
export LESS_TERMCAP_se=$'\E[0m'        # reset reverse video
export LESS_TERMCAP_us=$'\E[1;32m'     # begin underline
export LESS_TERMCAP_ue=$'\E[0m'        # reset underline

对于语法突出显示,请使用现有的强大功能lesspipe.sh来处理它,而不是编写自己的语法:https : //github.com/wofr06/lesspipe


1

我找到了这个简单而优雅的解决方案。您不必安装其他任何东西,因为大多数计算机上默认已经安装了任何东西。正如vim大多数计算机上默认安装的那样,它包含一个宏,可以vimless

使用它的一些选项是创建别名: alias vless='vim -u /usr/share/vim/vim74/macros/less.vim'

或创建一个符号链接: ln -s /usr/share/vim/vim74/macros/less.sh ~/bin/vless

那你就跑 vless myfile.py

我在这里获得了大部分信息


1
我已经安装alias lesser='/usr/share/vim/vim80/macros/less.sh'~/bash_aliases(在Ubuntu 18.04中)。可以使用快捷方式,例如f前进,b退回,d下降一半,u上升一半,q退出等...
Daniel

0

对我来说,最直观,最直接的解决方案是pygmentize
在.bashrc中添加以下几行

export LESS='-R'
export LESSOPEN='|pygmentize -g %s'

万一您无法致电pygmentize,只需像安装

pip install pygments

ps。该pygmentize可执行二进制会坐在/usr/local/bin/或在你的/home/username/.virtualenv/venvname/bin/地方了。


-2

这些对我来说都不是开箱即用的,我想出了一种简单的方法来完成这项工作,所以我想我会分享。

只需使用tmux,即可访问并滚动查看更大的历史记录,并完美保留色彩。


1
tmux不能在一个屏幕上允许多个终端吗,它如何减少较少的颜色显示?
Xen2050

@ Xen2050我认为这是一个不错的解决方法,尽管此答案并未说明如何进入滚动模式(Ctrl-b + [)
siikamiika

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.