在Linux中如何给命令输出添加颜色

15
例如,我想将locate命令的输出颜色设置为与其他终端文本区分开来。它应该像这样工作:
locate -bir pdf | some_command_to_color_the_result

颜色标记不应仅限于 locate 命令:我需要一种通用的解决方案,可以使用管道来为文本着色,例如将其提供给 grepcat 的输出。

如果没有内置的 Linux 命令,欢迎提供任何关于如何创建此类命令的提示。


2
grep --color 会提供颜色。 - V H
这取决于你想要着色的内容,但是grep --color '.'会以某种颜色显示所有内容(我尝试时是红色)。 - Jonathan Leffler
这回答了我的问题。我创建了一个别名 "alias color='grep --color .'",然后像这样使用它:"locate -bir pdf | color" - user3158243
可能是重复问题:*如何将彩色文本输出到Linux终端?* - Peter Mortensen
@PeterMortensen 你提出的目标是针对C ++的。这是一个bash问题。 - cigien
@JonathanLeffler:你也可以使用一个简单的技巧来在显示所有内容的同时着色特定的内容:egrep --color '^|regex'。例如:ps -ef | egrep '^|user1|bash' 显示整个输出,但也将 "user1" 和 "bash" 着色。当然,这会在行首(和正则表达式周围)引入转义码,但如果你使用 ... | cat(或 ... > resultfile),它们就不会再被着色了(因为没有使用 --color=always),因此不会影响进一步的处理。 - Olivier Dulac
10个回答

16

你可以使用转义序列来改变输出到bash shell的字体颜色。以下是一些您需要使用的颜色代码:

BLACK="\033[30m"
RED="\033[31m"
GREEN="\033[32m"
YELLOW="\033[33m"
BLUE="\033[34m"
PINK="\033[35m"
CYAN="\033[36m"
WHITE="\033[37m"
NORMAL="\033[0;39m"

一旦这些被定义好了,你就可以在正常的 echo 命令中使用它们。例如:

echo $variable_name;


echo -e $GREEN this text is green $NORMAL and this is normal

请注意,-e 并非始终必需,在某些操作系统(包括 osx)中需要它以启用转义序列。

有了这些定义,您可以构建脚本和管道来着色其他命令的输出。以下是我用于着色 svn up 输出的完整示例:

#!/bin/bash

BLACK="\033[30m"
RED="\033[31m"
GREEN="\033[32m"
YELLOW="\033[33m"
BLUE="\033[34m"
PINK="\033[35m"
CYAN="\033[36m"
WHITE="\033[37m"
NORMAL="\033[0;39m"

TMPFILE=.cvsup.tmp

svn up > $TMPFILE
svn status >> $TMPFILE
printf $YELLOW
grep -e ^"\? " -e ^"I " $TMPFILE
printf $GREEN
grep -e ^"R " -e ^"U " -e ^"G " $TMPFILE
printf $BLUE
grep -e ^"M " -e ^"E " $TMPFILE
printf $RED
grep -e ^"C " -e ^"! " -e ^"X " -e ^"~ " $TMPFILE
printf $PINK
grep ^"R " $TMPFILE
printf $PINK
grep ^"D " $TMPFILE
printf $CYAN
grep ^"A " $TMPFILE

printf $NORMAL
rm $TMPFILE

您还可以查看tput命令。


10
_Esc_="$( printf '\033' )"
_norm_="${Esc}[0m" #returns to "normal"
_bold_="${Esc}[0;1m" #set bold
_red_="${Esc}[0;31m" #set red
_boldred_="${Esc}[0;1;31m" #set bold, and set red.

somecommand | sed -e "s/someregexp/${_boldred_}&${_norm_}/g"  # will color any occurence of someregexp in Bold red

printf "%s" "$_red_" ; locate something ; printf "%s" "$_norm_"  # will color output of locate something in red
   #I (ab)use printf "%s" "something", as it's more portable than echo,and easy to modify

还有许多其他的方法(例如创建一个可以给正则表达式着色的函数/脚本,然后:somecommand | colorize -c _green_ 'foo.*bar' 'other'


10
当然,执行该任务的主要工具是lolcat
locate -bir pdf | lolcat

在此输入图片描述

安装方法:

sudo apt install lolcat 

查看man lolcat以进行自定义设置。

2
正是我正在寻找的,谢谢! - skill347

5

正如Jonathan Leffler所建议的,在答案中发表评论:

grep --color将提供颜色。


4
以下是我的答案:

1- 我在我的 .bashrc 文件中创建了一个别名

alias color='grep --color .'

2- 那么每当我想要着色管道文本输出时,我就会使用颜色别名,例如:

locate -bir pdf | color

这将把输出颜色变为红色


4

我更喜欢使用代码高亮工具:

highlight -O xterm256 -S sh

-S sh 代表将输入视为shell脚本语法。

更多信息请查看:http://www.andre-simon.de/

我通过 ~/.bashrc 将其设置为别名: enter image description here

enter image description here


2

有一种更好的方法来实现可定制化着色:

colorit

你可以像其他答案中所示使用some_command | colorit,但是它可以通过.coloritrc进行良好的配置。在我的配置文件中,我有以下内容:

dnl  Define some useful color variables
define(`red', `1')
define(`green', `2')
define(`magenta', `5')
dnl
dnl  Mark macro arguments: regexp foreground-color [background-color]
dnl
define(`mark', ``mark "$1"'' `ifelse(`$#', `3', ``"\033[3$2;4$3m"'',
``"\033[3$2m"'')' `"\033[m"')
dnl
divert
mark(`warning', magenta)
mark(`Warning', magenta)
mark(`Traceback', magenta)
mark(`Error', red)
mark(`FAIL', red)
mark(`ERROR', red)
mark(`XFAIL', green)
mark(`ok', green)
mark(`OK', green)
mark(`PASS', green)

我经常使用它来为编译器输出和类似的东西上色。有关更多信息,请参见我的.coloritrc


1

1
你应该查看在GitHub上可用的hl命令:
git clone http://github.com/mbornet-hl/hl

and on :

http://www.flashnux.com/notes/page_000022_US.html

hl是一个用C语言编写的Linux命令,专门设计用于给文本文件或命令输出着色。您可以同时使用多达42种颜色,并使用配置文件简化命令行。您可以给可以传输到另一个命令的每个命令的输出着色。如果您知道正则表达式,那么使用它将会非常容易。您可以使用手册了解如何使用它。


0
使用tput命令。大多数终端支持8种前景文本颜色和8种背景颜色(尽管有些支持多达256种)。使用setaf和setab功能,我们可以设置前景和背景颜色。颜色的确切呈现有点难以预测。许多桌面管理器在终端窗口上施加“系统颜色”,从而修改了前景和背景颜色。尽管如此,以下是颜色应该是什么:
值 颜色
0 黑色
1 红色
2 绿色
3 黄色
4 蓝色
5 洋红色
6 青色
7 白色
8 未使用
9 重置为默认颜色
实际示例:将颜色设置为红色,然后更改颜色并将其改回。
tput setaf 1; cat /proc/meminfo ; tput setaf 9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接