Bash - 基于符号的数字颜色,标签式
Bash - Number color based on sign, tabbed
我在终端中有这样的行
8 XLM 3.85 -10.18 -32.94 0.00003836 0.564 0.470 8.402
9 MIOTA -0.60 -3.38 -11.22 0.0002438 3.582 2.986 8.300
10 DASH 0.55 -2.01 -6.55 0.0742421 1090.820 909.358 7.102
11 NEO -0.40 -0.88 27.09 0.00832249 122.280 101.938 6.626
12 TRX 7.33 -18.68 42.45 0.00000791 0.116 0.097 6.369
如果 3、4、5 字段为正,我想将其打印为绿色,如果为负,则打印为红色。我正在使用 awk 和 printf,但不能同时使用 printf 和正确的制表符。
如果我用 awk 添加颜色代码,比如
awk '{ if(<0){="3[0;31m"sprintf("%.2f",)"3[0;0m"} else {="3[0;32m"sprintf("%.2f",)"3[0;0m"};}1'
然后制表符丢失或弄乱了。
没有颜色的完整命令是
curl -s "https://api.coinmarketcap.com/v1/ticker/?convert=EUR&limit=20" | jq -r '.[] | [.rank, .symbol, .percent_change_1h, .percent_change_24h, .percent_change_7d, .price_btc, .price_usd, .price_eur, .market_cap_eur] | @tsv' | awk '{ =sprintf("%.2f",); =sprintf("%.2f",); =sprintf("%.2f",); =sprintf("%.8f",); =sprintf("%.2f",); =sprintf("%.2f",); =sprintf("%.3f",/(1*10^9)) }1' | xargs printf '%2s %-5s %7s %7s %7s %12s %10s %10s %8s\n' 'r' 'curr' '1d' '24h' '7d' 'btc' 'usd' 'eur' 'mcap B'
您的字段间距正在修改,因为您修改的字段会导致 awk 重新编译记录,将输入空格 (IFS) 替换为 OFS 值。如果您更改整个记录而不是任何单个字段,则 awk 不会更改字段之间的间距:
使用 GNU awk for gensub():
$ cat tst.awk
BEGIN { red="3[0;31m"; green="3[0;32m"; norm="3[0;0m" }
{
for (i=3; i<=5; i++) {
[=10=] = gensub("(([^[:space:]]+[[:space:]]+){"i-1"})([^[:space:]]+)", "\1" ($i < 0 ? red : green) "\3" norm,1)
}
print
}
或使用任何 awk:
$ cat tst.awk
BEGIN { red="3[0;31m"; green="3[0;32m"; norm="3[0;0m" }
{
for (i=3; i<=5; i++) {
sub("([^[:space:]]+[[:space:]]+){"i-1"}", "&" ($i < 0 ? red : green))
sub("([^[:space:]]+[[:space:]]+){"i-1"}[^[:space:]]+", "&" norm)
}
print
}
$ awk -f tst.awk file
8 XLM 3.85 -10.18 -32.94 0.00003836 0.564 0.470 8.402
9 MIOTA -0.60 -3.38 -11.22 0.0002438 3.582 2.986 8.300
10 DASH 0.55 -2.01 -6.55 0.0742421 1090.820 909.358 7.102
11 NEO -0.40 -0.88 27.09 0.00832249 122.280 101.938 6.626
12 TRX 7.33 -18.68 42.45 0.00000791 0.116 0.097 6.369
所以你可以看到颜色:
我在终端中有这样的行
8 XLM 3.85 -10.18 -32.94 0.00003836 0.564 0.470 8.402
9 MIOTA -0.60 -3.38 -11.22 0.0002438 3.582 2.986 8.300
10 DASH 0.55 -2.01 -6.55 0.0742421 1090.820 909.358 7.102
11 NEO -0.40 -0.88 27.09 0.00832249 122.280 101.938 6.626
12 TRX 7.33 -18.68 42.45 0.00000791 0.116 0.097 6.369
如果 3、4、5 字段为正,我想将其打印为绿色,如果为负,则打印为红色。我正在使用 awk 和 printf,但不能同时使用 printf 和正确的制表符。
如果我用 awk 添加颜色代码,比如
awk '{ if(<0){="3[0;31m"sprintf("%.2f",)"3[0;0m"} else {="3[0;32m"sprintf("%.2f",)"3[0;0m"};}1'
然后制表符丢失或弄乱了。
没有颜色的完整命令是
curl -s "https://api.coinmarketcap.com/v1/ticker/?convert=EUR&limit=20" | jq -r '.[] | [.rank, .symbol, .percent_change_1h, .percent_change_24h, .percent_change_7d, .price_btc, .price_usd, .price_eur, .market_cap_eur] | @tsv' | awk '{ =sprintf("%.2f",); =sprintf("%.2f",); =sprintf("%.2f",); =sprintf("%.8f",); =sprintf("%.2f",); =sprintf("%.2f",); =sprintf("%.3f",/(1*10^9)) }1' | xargs printf '%2s %-5s %7s %7s %7s %12s %10s %10s %8s\n' 'r' 'curr' '1d' '24h' '7d' 'btc' 'usd' 'eur' 'mcap B'
您的字段间距正在修改,因为您修改的字段会导致 awk 重新编译记录,将输入空格 (IFS) 替换为 OFS 值。如果您更改整个记录而不是任何单个字段,则 awk 不会更改字段之间的间距:
使用 GNU awk for gensub():
$ cat tst.awk
BEGIN { red="3[0;31m"; green="3[0;32m"; norm="3[0;0m" }
{
for (i=3; i<=5; i++) {
[=10=] = gensub("(([^[:space:]]+[[:space:]]+){"i-1"})([^[:space:]]+)", "\1" ($i < 0 ? red : green) "\3" norm,1)
}
print
}
或使用任何 awk:
$ cat tst.awk
BEGIN { red="3[0;31m"; green="3[0;32m"; norm="3[0;0m" }
{
for (i=3; i<=5; i++) {
sub("([^[:space:]]+[[:space:]]+){"i-1"}", "&" ($i < 0 ? red : green))
sub("([^[:space:]]+[[:space:]]+){"i-1"}[^[:space:]]+", "&" norm)
}
print
}
$ awk -f tst.awk file
8 XLM 3.85 -10.18 -32.94 0.00003836 0.564 0.470 8.402
9 MIOTA -0.60 -3.38 -11.22 0.0002438 3.582 2.986 8.300
10 DASH 0.55 -2.01 -6.55 0.0742421 1090.820 909.358 7.102
11 NEO -0.40 -0.88 27.09 0.00832249 122.280 101.938 6.626
12 TRX 7.33 -18.68 42.45 0.00000791 0.116 0.097 6.369
所以你可以看到颜色: