![使用不同的颜色对同一输出中的不同文本块进行着色](https://linux22.com/image/110401/%E4%BD%BF%E7%94%A8%E4%B8%8D%E5%90%8C%E7%9A%84%E9%A2%9C%E8%89%B2%E5%AF%B9%E5%90%8C%E4%B8%80%E8%BE%93%E5%87%BA%E4%B8%AD%E7%9A%84%E4%B8%8D%E5%90%8C%E6%96%87%E6%9C%AC%E5%9D%97%E8%BF%9B%E8%A1%8C%E7%9D%80%E8%89%B2.png)
我有一个脚本,可以输出带有符号方向的 I/O 数据>>>
-<<<
输入 ( <<<
) 或输出 ( >>>
)。
<timestamp> >>>>>>>>>>
loads
of
output
<timestamp> <<<<<<<<<<
loads
of
input
我想获取此输出,并用一种颜色对输入进行着色,用另一种颜色对输出进行着色 - 有点像如何为git diff
文件版本中的差异着色。
我怎样才能用最少的打字量(最好是一行字)来做到这一点?
答案1
也许这样的东西awk
适合你:
awk 'BEGIN{ce="\033[0m"}
/>>>/{cs="\033[1;31m"}
/<<</{cs="\033[1;32m"}
{print cs$0ce}' your.data
那是:
BEGIN {
ce = "\033[0m"
}
/>>>/ {
cs = "\033[1;31m"
}
/<<</ {
cs = "\033[1;32m"
}
{
print cs $0 ce
}
答案2
为了全 shell、独立于终端、语义解决方案的利益,这里是另一种利用 进行颜色处理的方法tput
,它使用 terminfo 数据库为其识别的任何终端提供正确的颜色更改序列:
black=$(tput setaf 0)
red=$(tput setaf 1)
green=$(tput setaf 2)
yellow=$(tput setaf 3)
blue=$(tput setaf 4)
magenta=$(tput setaf 5)
cyan=$(tput setaf 6)
white=$(tput setaf 7)
off=$(tput sgr0)
echo ${red}some red text${blue} some blue text${green} and green${off} and back to normal.