garabik/grc
GitHub: garabik/grc
通用终端着色工具,通过正则匹配为命令输出和日志添加 ANSI 颜色,提升可读性。
Stars: 2131 | Forks: 160
# Generic Colouriser
Radovan Garabík (garabik @ kassiopeia.juls.savba.sk)
对于性急的用户 - 尝试以下命令:
```
grc netstat
grc ping hostname
grc tail /var/log/syslog
grc ps aux
```
由于不堪各类 logfile colo(u)?ri(s|z)ers、colortails、gccolors、colormakes 以及类似程序的泛滥——这些程序旨在通过插入 ansi 颜色控制代码使文本文件或不同程序的输出更具可读性——我决定编写自己的 colouriser,最终实现了所有这些程序的功能。
提供了两个程序:`grc` 和 `grcat`。其中主要的是 `grcat`,它充当过滤器,即接收标准输入,对其进行着色,然后写入标准输出。
## 配置
`grcat` 将配置文件的名称作为参数。
程序会按顺序搜索目录 `~/.grc/`、`/usr/local/share/grc/`、`/usr/share/grc/`。如果未找到文件,则假定其为位于其他位置的配置文件的绝对路径。
配置文件由条目组成,每个正则表达式对应一个条目,条目之间以非字母数字字符(# 除外)开头的行分隔。以 # 开头的行或空行将被忽略。
每个条目由几行组成。
每行的格式为:`keyword=value`
其中 keyword 是以下之一:regexp、colours、command、concat、skip、replace、count
只有 regexp 是强制性的,但除非您至少指定 colour、skip、replace 或 command 关键字,否则它本身没有太大意义。
**regexp** 是要匹配的正则表达式。
**colours** 是颜色列表,用逗号分隔(您可以只指定一种颜色),每种颜色对应 regexp 中指定的一个正则表达式组。
如果您使用特殊颜色名称 "previous",将使用前一行文本的颜色(实际上,如果前一行的第一个和最后一个字符的颜色都与默认颜色不同,则使用第一个字符的颜色)。
另一个特殊颜色名称 "unchanged" 将保持颜色不变,如果您需要匹配正则表达式的某些上下文,并且希望保持上下文的颜色不变,这很有用。
还有一个特殊名称是用直引号括起来的任意字符串。该字符串将直接插入到输出中匹配表达式的前面。该字符串会被 eval 执行,因此您可以使用常用的 python 转义序列。
这在启用 256 色的 xterm 上很有用,例如 `colours="\033[38;5;22m"` 会给您深绿色(灵感来自 Rutger Ovidius)。警告:字符串不能包含逗号。这是由于我的懒惰 :-)
**command** 是当 regexp 匹配时要执行的命令。其输出将与正常的标准输出混合,如果您想抑制它,请使用重定向符 (`>/dev/null`)。
**concat** 是一个文件的名称,当 regexp 匹配时,当前行将被追加到该文件中。
**skip** 可以是 `skip=yes`,在这种情况下,匹配的行将被跳过(从输出中丢弃),或者是 `skip=no`,表示不跳过。默认(如果您没有 skip 关键字)当然是不跳过。
**replace** 表示正则表达式匹配项将被替换为该值。所有先前的正则表达式都将针对原始文本进行评估,但如果它们匹配且替换改变了文本的长度,着色将*保持在相同位置*,这可能不是您想要的——因此最好将 `replace` 规则放在配置文件的开头。
所有后续的正则表达式将针对替换后的文本进行评估,而不是原始文本。
替换是通过 `re.sub()` 完成的,因此您可以使用 python 支持的任何内容——特别是 `\1`、`\2` 等,以包含来自原始匹配组的文本,例如:
```
regexp=(\d\d):(\d\d):(\d\d)
replace=\1h\2m\3s
```
将时间格式从 09:43:59 更改为 09h43m59s
**count** 是以下单词之一:once、more、stop、previous、block 或 unblock
- **once** 意味着如果 regexp 匹配,其第一次出现将被着色,程序将继续处理其他 regexp。
- **more** 意味着如果一行中有多个 regexp 匹配项,它们都将被着色。
- **stop** 意味着 regexp 将被着色,程序将移动到下一行(即忽略其他 regexp)
- **previous** 意味着计数将与上一行相同
- **block** 标记多行文本块的开始,使用相同的颜色着色
- **unblock** 显然标记此类块的结束
示例:
```
# 这可能是路径名
regexp=/[\w/\.]+
colour=green
count=more
```
这将匹配 `/usr/bin`、`/usr/local/bin/`、`/etc/init.d/syslogd` 和类似的字符串,并将其涂成绿色。
另一个例子:
```
regexp=^-{1,2}\s{0,1}$
colours=red
count=block
-
regexp=^\s{0,5}$
colours=default
count=unblock
```
这会将所有格式正确的邮件签名变成红色。
正则表达式从上到下评估,这允许嵌套和重叠的表达式。(例如,您用一种颜色给括号内的所有内容着色,如果随后的表达式匹配括号内的文本,它也会被着色)。
# 典型用法:
```
grcat conf.log < /var/log/syslog
/usr/sbin/traceroute www.linux.org | grcat conf.traceroute
grcat conf.esperanto < Fundamento.txt | less -r
```
为了便于使用,命令 `grc` 充当 `grcat` 的前端,自动选择配置文件,因此您可以编写:
```
grc netstat
grc ping hostname
grc tail /var/log/syslog
```
等等...
`grc` 将执行带有可选参数的命令,并将其标准输出通过管道传输到 `grcat`。
`grcat` 的配置文件由 `/etc/grc.conf` 或 `~/.grc/grc.conf` 文件确定。
`/etc/grc.conf` 或 `~/.grc/grc.conf` 的格式:每个条目由 2 行组成,条目之间可以有任意数量的空行或以 # 开头的行(注释)。
第一行是正则表达式,第二行是 `grcat` 的配置文件名称。
`grc` 后面行中第一个与正则表达式匹配的配置文件将作为 `grcat` 的配置文件传递给它
例如,如果您有
```
# log file
\b\w+\b.*log\b
conf.log
# traceroute 命令
(^|[/\w\.]+/)traceroute\s
conf.traceroute
```
在您的 `/etc/grc.conf` 中,那么输入 `grc cat /var/log/syslog` 将使用 `conf.log` 对输出进行着色,`grc /usr/sbin/traceroute www.linux.org` 将使用 `conf.traceroute`。
## 其他说明:
您应该熟悉正则表达式。很好的阅读材料是
在
该程序尚未针对速度进行优化。有些地方如果进行优化可以
带来很大的提升。
正则表达式由 python 处理,这意味着它们可能与您从 perl 或 grep 中了解到的略有不同。这种情况下不是我的错。
颜色是以下之一:
```
none, default, bold, underline, blink, reverse, concealed,
black, green, yellow, blue, magenta, cyan, white,
on_black, on_green, on_yellow, on_blue, on_magenta, on_cyan, on_white
beep
```
`on_red` 表示背景(而不是前景)被涂成
红色等...
额外的颜色可以是:`dark, italic, rapidblink, strikethrough`。
这些仅在某些终端上受支持,因此如果您想编写
可移植的配置文件,请避免使用它们(James Rowe 的想法)。
每行可以有更多属性(用空格分隔),例如
```
# 这可能是路径名
regexp=/[\w/\.]+
colours=bold blink green
count=more
```
将以粗体闪烁绿色显示路径名
## Python 2 & 3 兼容性
grc 和 grcat 现在都面向 python3;虽然尝试兼容 python2,这意味着 grc 和 grcat 都可以在 python2 和 python3 下运行。但是,所有正则表达式都是字符串,并且 grcat 处理的是字符串输入(而不是字节)。
## 提示
以下命令将在虚拟控制台 12 中显示漂亮的彩色日志:
如果您有 GNU tail:
```
tail --follow=name /var/log/syslog | grcat conf.log >/dev/tty12
```
或者,如果您有最新的 BSD tail:
```
tail -F /var/log/syslog | grcat conf.log >/dev/tty12
```
## 自动别名
您可以自动开始将 grc 与支持的命令一起使用。以下假设 `grc.` 位于 `/etc` 中。位置可能不同(例如,使用 [homebrew](https://formulae.brew.sh/formula/grc) 安装时为 `/usr/local/etc`);或者 `grc.sh` 可以放置在 `/etc/profile.d/` 中(这实际上是默认设置)。请注意,这具有一定的侵入性,最好在部署前进行测试。
### Bash
要为支持的命令设置别名,请附加到您的 `~/.bashrc`:
```
GRC_ALIASES=true
[[ -s "/etc/profile.d/grc.sh" ]] && source /etc/grc.sh
```
如果文件 `/etc/default/grc` 存在,它会首先被 source,因此您可以在那里放置一行 `GRC_ALIASES=true`。
### ZSH
或者对于 zsh 用户,附加到 `~/.zshrc`:
```
[[ -s "/etc/grc.zsh" ]] && source /etc/grc.zsh
```
### Fish
添加到 `~/.config/fish/config.fish` 或 `~/.config/fish/conf.d/` 中的新文件:
```
source /usr/local/etc/grc.fish
```
## 动态别名
通过运行以下代码,它将检查您的操作系统上已经安装了哪些程序(基于您的 `$PATH`),并回显结果。然后可以将其作为一次性操作添加到您的 shell 资源文件中。或者,通过删除代码中的 `echo`,它可以直接放置在您的 shell 资源文件中,并且每次都会创建必要的别名:
```
for cmd in g++ gas head make ld ping6 tail traceroute6 $( ls /usr/share/grc/ ); do
cmd="${cmd##*conf.}"
type "${cmd}" >/dev/null 2>&1 && echo alias "${cmd}"="$( which grc ) --colour=auto ${cmd}"
done
```
标签:Awesome, grc, grcat, 可读性, 开发辅助, 文本处理, 日志着色, 系统管理, 终端工具, 输出美化, 过滤, 逆向工具