读取带有“less”或“more”的文件时,如何以颜色获取内容?

Ope*_*way 482 linux colors less

当我在 Linux 中使用命令lessor读取文件时more,如何以颜色获取内容?

Chr*_*heD 537

请尝试以下操作:

less -R
Run Code Online (Sandbox Code Playgroud)

来自man less

-r 或者 --raw-control-chars

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

-R 或者 --RAW-CONTROL-CHARS

-r,但只有 ANSI“颜色”转义序列以“原始”形式输出。(……)

  • 应该注意的是,大多数程序使用 `isatty(2)` 系统调用来检查它们的标准输出是否是终端,如果不是,通常会禁用彩色输出。对于任何减少的管道,`isatty` 将返回 0。要检查这是否有效,请尝试 `echo -e '\x1b[32;1mtest\x1b[m' | 少 -r` (59认同)
  • 当文件本身包含需要显示的转义码时,这很有用。 (19认同)
  • 你也可以在你已经打开 `less` 时输入 `-R` 来实现这一点。 (19认同)
  • 这个答案在实际做某事的测试中并不擅长。 (11认同)
  • 仅当我在 grep 中包含 `--color=always` 选项时,这对我有用。:`grep --color=always foo myfile.txt | 少 -R` (6认同)
  • 恕我直言,这实际上应该是公认的答案,它更简单 (3认同)

Dar*_*idl 187

如果您只想告诉less解释颜色代码,请使用less -R. 参考


您可以以更少的方式利用 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
Run Code Online (Sandbox Code Playgroud)

在您.bashrc添加

export LESS='-R'
export LESSOPEN='|~/.lessfilter %s'
Run Code Online (Sandbox Code Playgroud)

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

chmod u+x ~/.lessfilter
Run Code Online (Sandbox Code Playgroud)

在 Debian 上测试。

你明白了。这当然可以进一步改进,接受更多扩展名、多个文件,或者为除 bash 之外的其他解释器解析 shebang。请参阅其他一些答案。

这个想法来自Pygments 制造商的一篇旧博客文章,但原始文章不再存在。


顺便提一句。您还可以使用此技术显示带有less.

  • @puk 你可以做类似`ls --color=always -l | 的事情 少 -R`。显然要输入很多,但您可以将其别名为“ll”之类的内容。也就是说,如果您不想使用任何额外的库。 (7认同)
  • 如果你想对源代码文件进行着色,你还需要通过运行 `chmod u+x ~/.lessfilter` 使 ~/.lessfilter 可执行。您还需要安装 pygmentize (http://pygments.org/download/)。 (6认同)
  • 要获取当前安装的 pygmentize 版本支持的所有唯一文件扩展名的列表,以适合粘贴到此 .lessfilter 脚本的格式,运行`pygmentize -L | grep -o "(文件名.*)" | sed -E "s,\(文件名 (.*)\),\1,gm;s/, /\n/g" | 排序 -u | tr "\n" "|"`。请注意,在某些 Linux 上,可能不需要设置 `LESSOPEN`,因为它已经设置为使用 `lesspipe`,它已经检测到 .lessfilter 文件(运行 `echo $LESSOPEN` 来检查)。 (3认同)
  • 在答案中添加了@SergiyByelozyorov 的评论。 (2认同)
  • 我的编辑被拒绝了,所以我想我会把它作为评论发布:不要间接测试命令的退出代码。您可以使用 `if grep -q "#\!/bin/bash" "$1"`(`-q` 抑制标准输出)。您可能希望使用 `2>/dev/null` 重定向标准错误。 (2认同)

小智 150

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

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

grep --color=always "search string" * | less -R
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我相信`grep -R` 用于指定递归搜索。`less -R` 是 `less` 正确吐出颜色所必需的。`grep --color=always [grep cmds] | less -R` 在 OS X 10.7.3 上对我有用! (10认同)
  • 不错,谢谢。除了我还需要使用 `-R` 作为 `less` 的选项。 (6认同)
  • 有没有办法让 grep 知道只用管道 less -R 命令然后只做着色?因此,我们不必一直放置 --color=always 和 less -R。 (2认同)
  • 当您需要将“git diff”通过管道传输到“less”时,这也适用。这样做:`git diff | less` 不会向您显示任何颜色。你需要这样做:`git diff --colors=always | less` 或 `git diff --colors=always some_file | 少`。(顺便说一下,我在 Windows 10 上使用 cygwin。) (2认同)

小智 40

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

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

此外,您将获得与vim(因为您实际上使用的是vim)相同的着色。

  • 请注意,您可能需要在管道时添加`view -` (10认同)
  • `vim` 是一个编辑器,它将整个文件加载到内存中,而 `less` 是一个分页器,只将文件部分加载到内存中。你会知道大文件的区别。 (8认同)
  • `ls --color=always > /tmp/file && view /tmp/file` 当然不起作用......它显示转义码而不是渲染它们。 (2认同)

jbb*_*bbr 21

要告诉较少显示颜色,请使用 -R 调用它:

less -R
Run Code Online (Sandbox Code Playgroud)

不幸的是,一些程序检测到它们的标准输出不是终端并禁用颜色 - 例如 pacman(Arch Linux 包管理器)。

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

unbuffer <command> | less -R
Run Code Online (Sandbox Code Playgroud)

使用 pacman 的示例

unbuffer pacman -Ss firefox | less -R
Run Code Online (Sandbox Code Playgroud)

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

要回答完整的问题:

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

pygmentize someSource.cpp | less -R
Run Code Online (Sandbox Code Playgroud)

  • 这个答案需要更多的赞成票。 (3认同)
  • 要在 Ubuntu 上使用 `unbuffer`,请使用 `sudo apt install expect` (2认同)

小智 17

pygmentize支持-g自动猜测要使用的词法分析器的选项,这对于STDIN从不检查任何扩展类型的情况下读取的文件很有用。

使用它,您只需要在.bashrc没有任何其他脚本的情况下设置以下 2 个导出:

export LESS='-R'
export LESSOPEN='|pygmentize -g %s'
Run Code Online (Sandbox Code Playgroud)

  • 简洁有效。我更喜欢定义别名,因为有时越少越好。所以: alias lesc='LESS="-R" LESSOPEN="|pygmentize -g %s" less' (4认同)

Ben*_*ier 10

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

如果你想要的是源代码的语法高亮,你需要一个源代码高亮器。我有时像这样使用pygmentize

pygmentize file.cpp | less
Run Code Online (Sandbox Code Playgroud)

或者

pygmentize file.cpp | more
Run Code Online (Sandbox Code Playgroud)

周围还有其他荧光笔。

这是相当快的。如果您不介意启动,vim则可以使用只读模式,如果您在vim.

view file.cpp
Run Code Online (Sandbox Code Playgroud)

或者查看 churnd 的回答。


Joe*_*der 8

这是另一个基于pygments的答案,有几个主要改进:

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

编辑:我在这里维护此脚本的更新/改进版本:https : //github.com/CoeJoder/lessfilter-pygmentize

原版如下:

安装 Pygments 和 Gawk

sudo apt-get install python-pygments python3-pygments gawk
Run Code Online (Sandbox Code Playgroud)

设置环境变量

检查是否lesspipelessfile已经启用:

echo $LESSOPEN
Run Code Online (Sandbox Code Playgroud)

如果您没有看到其中引用的任何程序,请确保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'
Run Code Online (Sandbox Code Playgroud)

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

export LESSOPEN='|~/.lessfilter %s'
Run Code Online (Sandbox Code Playgroud)

创建 ~/.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
Run Code Online (Sandbox Code Playgroud)


Spe*_*mon 5

为了扩展另一个答案,您可以通过稍微更改 .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
Run Code Online (Sandbox Code Playgroud)

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

export LESS='-R'
export LESSOPEN='|~/.lessfilter %s'
Run Code Online (Sandbox Code Playgroud)

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

$ chmod 700 ~/.lessfilter
Run Code Online (Sandbox Code Playgroud)

另外我想补充一点,在 debian 下 pygments 包称为 python-pygments。一开始我很难找到它,因为“pigments”明显错误地拼写为“pygments”,这不足以提示我这是一个可能由包管理器以“python-”为前缀的包。

  • 2 条评论: 1)感谢您的改进。 2)像“投票为最佳答案”这样的短语不太好;这可能会改变(事实上,如果这比那个答案更好,_this_帖子可能会成为最佳答案,此时它只会令人困惑。也许只是说“扩展另一个答案”或“captaincomic的答案”? (2认同)

ars*_*sra 5

使用GNU 源代码高亮显示apt如果有的话可以安装它,或者从源代码安装它。然后在 Source-highligh 文档的帮助下为 less 设置一个“输入预处理器

这是康斯坦丁·塞雷布里尼提出的。脚本 src-hilite-lesspipe.sh 将与 source-highlight 一起安装。您可以使用以下环境变量:

 export LESSOPEN="| /path/to/src-hilite-lesspipe.sh %s"
 export LESS=' -R '
Run Code Online (Sandbox Code Playgroud)

这样,当你使用 less 浏览文件时,如果是由 source-highlight 处理的源文件,就会自动高亮显示。

Xavier-Emmanuel Vincent 最近提供了 ANSI 配色方案的替代版本 esc256.style:某些终端可以处理 256 种颜色。Xavier 还提供了一个脚本,用于检查您的终端可以处理多少种颜色,并在以防万一时使用 256 变体。该脚本名为 source-highlight-esc.sh,它将与其他二进制文件一起安装。


xuh*_*dev 5

摘自我关于改善 less 体验的完整博客文章: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
Run Code Online (Sandbox Code Playgroud)

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


小智 5

可以使用开箱即用的颜色来替代 less/more 的方法是 bat。您可以使用大多数包管理器安装它,将其用作寻呼机以及猫的替代品。

https://github.com/sharkdp/bat