カラーフィルターを介したコマンドのパイピング


13

Unixにはこのようなものがありますか?

$ echo "this should show in red" | red
$ echo "this should show in green" | green
$ echo "this should show in blue" | blue

ここでは、リテラルカラーコードテキストが表示されることを意味しません(たとえば、ファイルに貼り付けられる)。テキストが実際にターミナルにその色として表示されることを意味します。これは可能ですか?

回答:


14

これを行う小さなスクリプトを次に示します。これをcolorのディレクトリに保存します$PATH(たとえば、にある~/bin場合$PATH):

#!/usr/bin/env perl

use strict;
use warnings;
use Term::ANSIColor; 

my $color=shift;
while (<>) {
    print color("$color").$_.color("reset");
} 

次に、テキストをスクリプトに渡し.て、一致するパターンとして指定し、色を指定します。

スクリプトを実行している端末のスクリーンショット

サポートされている色は、端末の機能によって異なります。詳細については、パッケージのドキュメントを参照してくださいTerm::ANSIColor


どこかに渡すのに有効な色のリストはありますか?
ジョージ

セットアップに依存する@George。RGB対応の端末を使用している場合rgb001rgb123などのようなものを使用することもできます。詳細については、perldoc.perl.org / Term / ANSIColor.html#Supported-Colorsを参照してください。
テルドン

23

あなたはそのために使用tputします:

tput setaf 1
echo This is red
tput sgr0
echo This is back to normal

これはパイプを構築するために使用できます:

red() { tput setaf 1; cat; tput sgr0; }
echo This is red | red

基本色は、それぞれ黒(0)、赤(1)、緑、黄、青、マゼンタ、シアン、白(7)です。詳細はすべてterminfo(5)マンページにあります。



1

(コメントで説明したように、お持ちの場合tput代わりに使用してください)

オプションを使用しechoてANSIエスケープを理解するbourneシェルおよび(組み込み)コマンドを使用\e-eます。

black()  { IFS= ; while read -r line; do echo -e '\e[30m'$line'\e[0m'; done; }
red()    { IFS= ; while read -r line; do echo -e '\e[31m'$line'\e[0m'; done; }
green()  { IFS= ; while read -r line; do echo -e '\e[32m'$line'\e[0m'; done; }
yellow() { IFS= ; while read -r line; do echo -e '\e[33m'$line'\e[0m'; done; }
blue()   { IFS= ; while read -r line; do echo -e '\e[34m'$line'\e[0m'; done; }
purple() { IFS= ; while read -r line; do echo -e '\e[35m'$line'\e[0m'; done; }
cyan()   { IFS= ; while read -r line; do echo -e '\e[36m'$line'\e[0m'; done; }
white()  { IFS= ; while read -r line; do echo -e '\e[37m'$line'\e[0m'; done; }

echo '    foo\n    bar' | red

または、より一般的なシェルスクリプト(たとえば、/usr/local/bin/colorize):

#!/bin/sh

usage() {
    echo 'usage:' >&2
    echo '  some-command | colorize {black, red, green, yellow, blue, purple, cyan, white}' >&2
    exit 1
}

[ -z "$1" ] && usage

case $1 in
    black)  color='\e[30m' ;;
    red)    color='\e[31m' ;;
    green)  color='\e[32m' ;;
    yellow) color='\e[33m' ;;
    blue)   color='\e[34m' ;;
    purple) color='\e[35m' ;;
    cyan)   color='\e[36m' ;;
    white)  color='\e[36m' ;;
    *) usage ;;
esac

IFS=
while read -r line; do
    echo -e $color$line'\e[0m'
done

IFS=空白のトリミングを防ぐために必要です(詳細についてはPOSIXを参照)。

IFSの仕組み


を使用することをお勧めしtputます。
LinuxSecurityFreak

これは完全に移植性のないソリューションです。POSIXに従う必要があるということです。
LinuxSecurityFreak

1
もちろん、できれば。組み込みシステムやbusyboxなどのレスキュー環境で使用することを目的としています。私はこれらのコードスニペットがいくつかの状況で役立つと信じているので、この答えを書くことにしました-少なくともbusyboxユーザーと、組み込み環境でシェルの組み込みコマンドでのみ色を出力しなければならない私にとって。
wataash

通常のbusyboxにはtputがないと言うのを忘れていました。
wataash
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.