`highlight` 命令

l0b*_*0b0 15 shell colors highlighting text-processing

是否有一个命令可用于在将整个字符串传递给 stdout 的同时轻松突出显示(使用颜色、粗体文本或倒置的背景/前景)标准输入中的特定字符串?我正在考虑构建它,但如果它已经存在,我宁愿使用它。一些理想的功能:

  1. 单独的高亮字符串以不同的方式以自动方式突出显示。例如,第一个字符串将以红色突出显示,第二个以绿色突出显示,第三个以蓝色突出显示,无需手动配置
  2. 检测颜色支持并回退到粗体/反转/其他可用的突出显示方法。
  3. 允许匹配正则表达式和文字字符串。
  4. 如果匹配项重叠,最好做一些聪明的事情,例如“foobar”和“barbar”。
  5. 除了添加颜色代码之外,stdin 和 stdout 之间没有任何修改。

小智 6

Sed 来救援!

你可以改进它(因为它确实需要它)但它运行得很好。

$ cat >~/bin/hilight <<EOF
#!/bin/bash
while [ $# -gt 0 ]
do
 COMANDO=$COMANDO's/'$1$'/\033[01;'$2$'m\033[K\\0\033[m\033[K/g\n'
 shift;shift;
done

sed -e "$COMANDO"
EOF
Run Code Online (Sandbox Code Playgroud)

为简单起见,hilight 接受一对参数(首先是匹配,其次是颜色)在此脚本中,属性始终为粗体

阅读 man console_codes (Graphic Rendition) 以查看颜色转义序列,或者试试这个

for attrib in $(seq 0 12); do
  for color in $(seq 30 37) $(seq 40 47) $(seq 90 97); do
    printf %b " $attrib $color:\033[$attrib;${color}mhi, dudes\033[m"
  done
done
Run Code Online (Sandbox Code Playgroud)

使用这个作品时它有重要的缺点:

$ dmesg | hilight \\[ 34 ] 34
Run Code Online (Sandbox Code Playgroud)

但这根本不是:

$ dmesg | hilight \\[ 34 ] 34 [[:digit:]] 31
Run Code Online (Sandbox Code Playgroud)

因为 [:digit:] 找到了之前替换的转义序列中的数字。

就像是:

$ cat /var/log/kern.log | hilight kernel 31 a 34 et 33
Run Code Online (Sandbox Code Playgroud)

将始终正常工作。

使用 time 命令我发现这将经过的时间增加四,这并不算太多。

您可以将 sed 命令替换为您喜欢或适合您需要的任何其他解析器(awk 等...)


wnr*_*rph 4

也许是Radovan Garab\xc3\xadk\ 的 Generic Colouriser (grc)?它需要一个配置文件作为参数并与正则表达式一起使用。所以并不是完全没有配置,但是你可以使用进程进程替换(<(list)),所以无论如何都不需要手动配置:-)

\n