bash:出力の2列目をカラー化


8

たとえば、lsから次の出力があるとします。

$ ls -lAhF /bin
-rwxr-xr-x 1 root root 905K Apr 10  2010 bash*
-rwxr-xr-x 3 root root  31K Dec 26  2011 bunzip2*
-rwxr-xr-x 1 root root 505K Nov 15  2010 busybox*
-rwxr-xr-x 3 root root  31K Dec 26  2011 bzcat*
lrwxrwxrwx 1 root root    6 Jun 24  2012 bzcmp -> bzdiff*
...

私は、2番目の列に色を付ける方法を探しています。sedを使用してパターンを色付けする方法は知っていますが、特定の列を色付けする方法はわかりません。基本的に、'\033[0;31m'最初のスペースの後と'\033[0m'2番目のスペースの前に挿入する必要があります。または、おそらくもっとエレガントな方法がありますか?


1
醜い:ls --color -l | sed -e $'s/ *[^ ]* /\033[0;31m&\033[0m/'
frostschutz 2013年

回答:


10

GNUがgrep提供されると、PCREサポートを使用してビルドされます。

ls -l | GREP_COLORS='mt=1;41;37' grep --color -P '^\S+\s+\K\S+'

sed

on=$(tput setaf 7; tput setab 1; tput bold) off=$(tput sgr0)
ls -l | sed "s/[^[:blank:]]\{1,\}/$on&$off/2"

を使用するsetafと、端末がANSIカラーエスケープシーケンスをサポートすることを想定しているため、ハードコーディングすることもできます。ここではksh93(またbashzsh)構文を使用します。

on=$'\e[1;47;37m' off=$'\e[m'

n 番目の列に一般化するには:

n=5

GREP_COLORS='mt=1;41;37' grep --color -P "^(\S+\s+){$(($n-1))}\K\S+"

sed "s/[^[:blank:]]\{1,\}/$on&$off/$n"

参考文献


grep -P素晴らしい。どうもありがとう。
user1968963 2013年

6

このようなもの?

awk -v on="$(tput bold)" -v off="$(tput rmso)" '{ $2=on $2 off }; 1'

編集:適切なtputサブコマンドを使用します。


$1ただし、設定すると列の配置が崩れます。
ステファンChazelas

2
厳密に言うと、rmsoキャンセルではなくsmso(スタンドアウトモード)、ではありませんbold。多くの端末(キャンセルtput rmsoないでくださいtput bold)。
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.