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, 可读性, 开发辅助, 文本处理, 日志着色, 系统管理, 终端工具, 输出美化, 过滤, 逆向工具