可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
Is there a method to colorize the output of cat
, the way grep
does.
For grep
, in most consoles it displays a colored output highlighting the searched keywords. Otherwise, you can force it by calling grep --color
Is there a generic way to color the output of any program according to your personal choice.
From what I understand, the program itself is not responsible for the colors. It is the shell.
I am using the default shell in FreeBSD 5.2.1 which looks like it has never seen colors since epoch.
回答1:
cat
with syntax highlighting is simply out of scope. cat
is not meant for that.
If you just want to have the entire content of some file coloured in some way (with the same colour for the whole file), you can make use of terminal escape sequences to control the color.
Here's a sample script that will choose the colour based on the file type (you can use something like this instead of invoking cat
directly):
#!/bin/bash
fileType="$(file "$1" | grep -o 'text')"
if [ "$fileType" == 'text' ]; then
echo -en "\033[1m"
else
echo -en "\033[31m"
fi
cat $1
echo -en "\033[0m"
The above (on a terminal that supports those escape sequences) will print any text file as 'bold', and will print any binary file as red. You can use strings
instead of cat
for printing binary files and you can enhance the logic to make it suit your needs.
回答2:
I'd recommend pygmentize
from the python package python-pygments
. You may want to define the following handy alias (unless you use ccat
from the ccrypt package).
alias ccat='pygmentize -g'
And if you want line numbers:
alias ccat='pygmentize -g -O style=colorful,linenos=1'
回答3:
Options:
pygmentize is good. I have an alias:
alias c='pygmentize -g'
but highlight is another widely available alternative is
alias cats='highlight -O ansi --force'
Installation:
You may have to install pygments
using:
sudo pip install pygments
sudo easy_install Pygments #for Mac user
and for highlight
package which is easily available on all distributions
sudo apt-get install highlight
sudo yum install highlight
- Bitbucket repo: https://bitbucket.org/birkenfeld/pygments-main
- GitHub mirror: https://github.com/sglyon/pygments
In Action:
I'm attaching shots for both down below for a good comparison in highlightings
Here is pygmentize
in action:
and this is highlight
:
回答4:
The tool you're looking for is probably supercat (here's a quick introduction published by Linux Journal).
I realize that this answer is late, and that it doesn't fully meet the OP requirements. So I'm adding it just for reference (it could be useful for other people looking for how to colorize text file output).
回答5:
vimcat
is single-file (shell script) and works good:
http://www.vim.org/scripts/script.php?script_id=4325
Last update is from December 2013. Hint: you can force file type recognition by vimcat -c "set ft=<type>"
.
回答6:
There is a colorized version of cat - ccat. Get it from https://github.com/jingweno/ccat/.
Installation on Linux/Windows/macOS
It is a single standalone executable so to install it you can unpack the binary version for your OS from https://github.com/jingweno/ccat/releases and copy the ccat binary for example to /usr/local/bin
.
If you want to avoid binaries, or if there is no binary for your platform (e.g. raspberry pi, etc), then you can alternately compile from source given that you have a working go
development environment (apt install golang
on debian-based linuxes or brew install golang
on mac):
go get -u github.com/jingweno/ccat
The ccat
binary will be created under your $GOPATH/bin
.
Installing on Mac via homebrew
brew install ccat
Alias to cat
To replace regular cat
with ccat
add in ~/.bashrc
:
alias cat="ccat $*"
alias cat0="/bin/cat $*" # for cases when you need plain `cat`
ccat
is implemented in Go, so it is a native binary which runs much faster than Python-based solutions, such as pygments, the module behind pygmentize
; I didn't see any noticeable speed difference between cat
and ccat
.
回答7:
From late April 2018 onwards:
Bat - A cat(1) clone with syntax highlighting and Git integration.
The project is a cat clone with support for colors and customizations written in Rust. It offers not only syntax highlighting with multiple themes, but also Git integration. As described in the documentation:
bat tries to achieve the following goals:
- Provide beautiful, advanced syntax highlighting
- Integrate with Git to show file modifications
- Be a drop-in replacement for (POSIX) cat
- Offer a user-friendly command-line interface
It is, needless to say, much faster than pygmentize and does not choke when confronted with large files.
Source code and binary releases + installation instructions can be found in the Github repository, as well as a comparison to alternative programs.
回答8:
The best way and the easiest way to do it if you have vim in your machine is to use vimcat
which comes with vimpager
program.
- Install vimpage with
git clone git://github.com/rkitover/vimpager
cd vimpager
sudo make install
Run vimcat:
vimcat index.html
回答9:
source-highlight
Maybe it's possible to find interesting source-highlight
released under GNU: a package different from highlight
.
Excerpt from apt-cache show source-highlight
:
Description-en: convert source code to syntax highlighted document.
This program, given a source file, produces a document with syntax
highlighting.
It supports syntax highlighting for over 100 file formats ...
For output, the following formats are supported: HTML,
XHTML, LaTeX, Texinfo, ANSI color escape sequences, and DocBook
I did some alias (Cat and PCat, see below) and this is their output
You can install on Debian based with
sudo apt-get install source-highlight
and add it as alias e.g. in your .bash_aliases
with something like the line below.
alias Cat='source-highlight --out-format=esc -o STDOUT -i'
Cat myfile.c # or myfile.xml ...
Or you can do a similar alias (without the -i
at the end to have the possibility to pipe in)
alias PCat='source-highlight --out-format=esc -o STDOUT '
tail myfile.sh | PCat # Note the absence of the `-i`
Among the options that it's possible to read from man source-highlight
the -s
underlines that is possible to select, or force, the highlighting by command line or to leave to the program this duty:
-s, --src-lang=STRING source language (use --lang-list to get the complete list). If not specified, the source language will be guessed from the file extension.
--lang-list
list all the supported language and associated language definition file
回答10:
From what I understand, the binary itself is not responsible for the colors. It is the shell.
That't not correct. Terminal just interprets the color codes that is output to the terminal. Depending on its capability it can ignore certain formatting/coloring codes.
From man page it does not seem cat supports coloring its output. Even if it were to support coloring like grep what should it color in the text file? Syntax highlighting required knowledge of underlying language which is not in the scope of simple utility like cat.
You can try more powerful editors like vim,emacs, gedit etc on unix platform if seeing the code highlighted is your goal.
回答11:
On OSX simply do brew install ccat
.
https://github.com/jingweno/ccat. Like cat but displays content with syntax highlighting. Built in Go.
回答12:
Old question, just answering for the record to provide the solution I ended up using. Perhaps this is a bit hacky (probably not the original intent of the parameter), but:
alias cgrep='grep -C 9000'
cat whatever | cgrep 'snozzberries'
..grep -C N
will provide N lines of context above and below the found item. If it's larger than the input, the whole input is included. In this case, we just make sure it's larger than any typical terminal output we'll want to look at manually, which is generally what you're looking to do if highlighting.
EDIT : However, this solution suggested below by Beni Cherniavsky-Paskin is superior -- it matches (and highlights) either the word you're looking for or the beginning of the line (not highlightable). The net result is exactly what you want.
cat whatever | egrep 'snozzberries|$'
That's the new best solution I've seen for that problem, thanks Beni.
回答13:
In this question https://superuser.com/questions/602294/is-there-colorizer-utility-that-can-take-command-output-and-colorize-it-accordin grcat
/grc
tool was recommended as alternative to supercat
.
Man of grc and of grcat
; it is part of grc package (sources):
grc - frontend for generic colouriser grcat(1)
grcat - read from standard input, colourise it and write to standard output
回答14:
bat precisely does that and can be aliased to cat alias cat='bat'
回答15:
I have written the small script to perform the colourization using pygmentize
.
colorize_via_pygmentize() {
if [ ! -x "$(which pygmentize)" ]; then
echo "package \'Pygments\' is not installed!"
return -1
fi
if [ $# -eq 0 ]; then
pygmentize -g $@
fi
for FNAME in $@
do
filename=$(basename "$FNAME")
lexer=`pygmentize -N \"$filename\"`
if [ "Z$lexer" != "Ztext" ]; then
pygmentize -l $lexer "$FNAME"
else
pygmentize -g "$FNAME"
fi
done
}
And then make an alias to script. alias cat=colorize_via_pygmentize
. Also dont forget to save this in ~/.bashrc.
回答16:
If you just want a one liner to set cat
output to a given color, you can append
alias cat="echo -en 'code' | cat - "
to your ~/.$(basename $SHELL)rc
Here is a gist with color codes: https://gist.github.com/chrisopedia/8754917
I like '\e[1;93m'
, which is high intensity yellow. It looks like this: