lsの出力列に色を付ける方法は?


8

タイトルの種類はそれをすべて言う:私はのようなものの出力のものをきちんと色付きの列を取得したいls -alのように、発言権を、10basetomの答えこの質問

リンクされた回答からの構文強調表示されたコードスニペットのスクリーンショット


まあ、これは素晴らしいアイデアです!しかし、どのOSを使用していますか?
JakeGould

2
これは、SEソフトウェアによって(誤って)Bash構文で強調表示されているようです。列ごとに色分けされていないようですが、数字(数値)は1つの色を取得し、大文字で始まるものは別の色を取得します。列ごとの色分けは可能ですが、かなり異なります。
ボブ

3
一般的な意味では、sedまたはawkを使用して列セパレータで出力を分割し、ANSIエスケープシーケンスを挿入できます
ボブ


私はWindows 10 Ubuntuサブシステムを使用していますが、macOSへの移行中です(WinXが判明した完全な災害を想定して...)
Pirx

回答:


8

これはで実行できawkます。残念ながら、の形式ls -lは指定されていないため、すべてのシステムで機能するソリューションを考え出すことは不可能であり、一部のシステムでは、どの列にどの色を使用するかを調整する必要があります。


まず、で使用されている元のスペースを保持したいと思いますls -l。そうしないと、列の配置が正しくなくなります。このSO回答のFPATおかげで、オプションでこれを行うことができます:

ls -la | awk '
    BEGIN {
        FPAT = "([[:space:]]*[^[:space:]]+)";
        OFS = "";
    }

awk(各位置PARAM、 $1$2など)一つのフィールド、現在の行のすなわち、1つのカラムを指します。FPAT上記のオプションで行ったことは、各フィールドを再定義して先行するすべてのスペースを含めることです。そのため、元printに戻すと、スペースが保持され、列が同じ位置に留まります。

これで、各フィールドを編集してカラーコードを挿入し、編集した出力を印刷できます。

    {
        $2 = "\033[31m" $2 "\033[0m";
        $3 = "\033[36m" $3 "\033[0m";
        $4 = "\033[36m" $4 "\033[0m";
        $5 = "\033[31m" $5 "\033[0m";
        $6 = "\033[36m" $6 "\033[0m";
        $7 = "\033[36m" $7 "\033[0m";
        $8 = "\033[31m" $8 "\033[0m";
        print
    }
'

各列は、デフォルト(にリセットバックされることに注意してください0[およびmその後)。色が複数の列にまたがるようにしたい場合は、そのコードを省略できます。個人的には、各列を個別に指定することを好みます。


で再利用可能なコマンドを定義できます.bashrc。例えば:

lsc() {
    ls -la | awk '
        BEGIN {
            FPAT = "([[:space:]]*[^[:space:]]+)";
            OFS = "";
        }
        {
            $2 = "\033[31m" $2 "\033[0m";
            $3 = "\033[36m" $3 "\033[0m";
            $4 = "\033[36m" $4 "\033[0m";
            $5 = "\033[31m" $5 "\033[0m";
            $6 = "\033[36m" $6 "\033[0m";
            $7 = "\033[36m" $7 "\033[0m";
            $8 = "\033[31m" $8 "\033[0m";
            print
        }
    '
}

この関数定義を実行するには、bashセッションの再起動(またはrun source ~/.bashrc)が必要になる場合があります。

ここから、を呼び出すだけでlsc、必要な出力が得られます。

カラー出力のスクリーンショット


素晴らしい人たち、これはほとんど私が欲しいものです;-)真剣に、しかし、もう1つひねりを加えて、ファイル名に色を付けたいです。ls -al --color = autoはそれを行いますが、上記のソリューションに--colorオプションを追加しただけでは、カラーコードが取り除かれているようです。それらを維持するためにawkを取得できますか?
Pirx、2018

2番目のコメント、これは好奇心から外れています。私の元の質問で参照した回答では、10basetomは上記のいずれも使用せず、色付きの列がまだあるようです。それは彼が別のバージョンのlsを使用したためか、またはいくつかの豪華なスマート端末を使用したためでしょうか?
Pirx 2018

@Pirx回答のカラーリングはStack Exchangeソフトウェアによって適用されます。端末からのものではありません。これは、出力がコードブロックに貼り付けられており、質問にbashタグが含まれていたためです。これにより、質問と回答のコードタグにBash構文の強調表示が自動的に適用されます。この場合、実際には正しくありません。コード内の文字列が意図的に色を付けていなくても、コード内の文字列が赤であるのと同じ理由です。
ボブ

1
@Pirxの使用--color=always。ファイル名の列に異なる色を適用しない限り($9この例では)、awkそれらを通過させる必要があります。
ボブ

@Pirxサイドノート--color=alwaysは、GNU拡張であるため、GNU以外のシステム(macOS、他のBSDなど)を使用している場合は GNUバージョンをインストールするか、代替バージョンを使用する必要があります。
ボブ

6

これにより、2列目ls -alFが赤、3〜8列目が青、9 列目が黒で印刷されます。

ls -alF | awk -v black=$(tput setaf 0) -v red=$(tput setaf 1) -v blue=$(tput setaf 4) '{$2=red $2; $3= blue $3; $9=black $9} 1'

これは単なる例です。これは、必要に応じてカスタマイズできます。

複数行にまたがるコードを好む人のために:

ls -alF | awk -v black=$(tput setaf 0) \
    -v red=$(tput setaf 1) \
    -v blue=$(tput setaf 4) \
    '{
        $2=red $2
        $3= blue $3
        $9=black $9
     }

     1'

細部

tput端末用のさまざまな制御コードを生成するユーティリティです。例えば、 tput setaf nへのフォアグラウンドカラーを設定するn場合n、0から7の範囲であり得ます

0  Black
1  Red
2  Green
3  Yellow
4  Blue
5  Magenta
6  Cyan
7  White

tputとそのカラー機能について詳しくは、こちらをご覧ください

AWKコード定義変数blackredおよびblueそのそれぞれ、黒、赤、青用の端子コードを含みます。これらのコードは、色を付けたい列の先頭に配置されます。

1つのトリックは、カラーコードが自動的にリセットされないことです。したがって、ある行で最後に指定した色が何であれ、別のcolorコマンドが指定されていない限り、次の行のデフォルトの色になります。


1
ええと、変数を定義する上で良い呼びかけです。あなたがそれを内からできるとは知らなかったawk!列の配置を維持するためにパターンも含めることをお勧めします:)
Bob

@ボブそして、私FPATは間隔を正しく保つためのあなたのトリックが好きです。
John1024 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.