web-dev-qa-db-ja.com

複数の色のGrep出力?

2つ以上のパターンを持つテキストファイルに対してgrepを実行するエレガントな方法がbashにあり、一致する各パターンは異なる色で出力されますか?

MALEAUGUSTで一致する行は、青のMALEとオレンジのAUGUSTを出力しますか? sedawkgrep、およびクレヨンなどの使用を受け入れています。

47
Evil Genius

--color = alwaysを指定し、正規表現「foo | $」を使用してすべての行を渡すことにより、異なる色でgrepsをカスケードできます。

例えば:

tail -f myfwlog | GREP_COLOR='01;36' egrep --color=always 'ssh|$' | GREP_COLOR='01;31' egrep -i --color=always 'drop|deny|$'

行全体を強調表示する場合は、それに応じて正規表現を更新します。

.... GREP_COLOR='01;31' egrep -i --color=always '^.*drop.*$|^.*deny.*$|$'
50
Rob Windsor

grepは正規表現マッチャーであり、構文ハイライターではありません:)。それぞれGREP_COLORの異なる値を使用して、grepの複数の呼び出しを使用する必要があります。

GREP_COLOR="1;32" grep foo file.txt | GREP_COLOR="1;36" grep bar

これにより、「foo」と「bar」が両方に一致する行で異なる色で強調表示されます。 allいずれかのパターンの発生を処理する(簡単な)方法はないと思います。2つの独立した呼び出しの出力ストリームをマージする以外は:

{ GREP_COLOR="1;32" grep foo file.txt
  GREP_COLOR="1;36" grep bar file.txt
} | ...

各正規表現に個別の色を割り当てる方法があった場合とは明らかに異なって見えます。


awkを使用して、各一致を正しい制御コードでラップされたそれ自体と置き換えることができます。

 echo "foo bar" | awk '{ gsub("bar", "\033[1;33m&\033[0m");
                         gsub("foo", "\033[1;36m&\033[0m"); print }'

各行で、指定された正規表現に一致するものをすべて、希望する色(&が行う)のANSIエスケープシーケンスでラップされたそれ自体(grep --color)でグローバルに置き換えます。すべての可能な一致を処理した後、行を明示的に印刷する必要があります。

29
chepner

すぐに使えるものが必要な場合は、おそらく hhighlighter を探しているでしょう。

次に例を示します。JBoss output

ご覧ください。単語を異なる色で自動的に色付けするのに非常に便利です。 ack の上に構築された印象的なプロジェクトです。

15

テキストファイル内の文字列を強調表示する必要があり、自分のニーズに合った方法が見つからなかったため、正規表現に一致する文字列を色付けする簡単なCプログラムを作成しました。

GitHubからソースコードをダウンロードできます。

git clone http://github.com/mbornet-hl/hl

その後:

cd hl/cr; make

使用方法は次のとおりです。

hl: version 1.21
Usage: hl [-h|-eidD][-E][-rgybmcwRGYBMCW] regexp ...
  -h : help
  -v : version
  -u : do not bufferize output on stdout
  -e : extended regular expressions
  -i : ignore case
  -E : print on stderr
  -r : red
  -g : green
  -y : yellow
  -b : blue
  -m : Magenta
  -c : cyan
  -w : white
  -R : red     (reverse video)
  -G : green   (reverse video)
  -Y : yellow  (reverse video)
  -B : blue    (reverse video)
  -M : Magenta (reverse video)
  -C : cyan    (reverse video)
  -W : white   (reverse video)
  -d : debug
  -D : display regular expressions

Wordの赤を赤、Wordの青を青に色付けするには、次のコマンドを入力するだけです。

echo "red blue red blue" | hl -r red -b blue

そして、これはifconfigコマンドの出力を強調する例です:

hl -ei -m '^(eth|(vir)?br|vnet)[0-9.]*:[0-9]+\>'             \
       -b '^(eth|(vir)?br|vnet)[0-9.]*\.[0-9]+\>'            \
       -c '([0-9a-f]{2}:){5}[0-9a-f]{2}'                     \
       -g '\<UP\>|\<RUNNING\>|([0-9]{1,3}\.){3}[0-9]{1,3}\>' \
       -y '^(eth|(vir)?br|vnet)[0-9.:]*\>'                   \
       -W '[0-9a-f]{4}::[0-9a-f]{4}\:[0-9a-f]{4}:[0-9a-f]{4}:[0-9a-f]{4}' \
       -r ' (errors|dropped|overruns):[^0][0-9]*'

色を指定する順序は重要です:文字列が複数の正規表現と一致する場合、1番目の文字列が2番目の文字列よりも優先度が高く、2番目の文字列が3番目の文字列よりも優先度が高くなります...

お役に立てれば。

8
Bush

素晴らしいrpenをお試しください http://github.com/rtulke/rpen

require egrep or grep

次に、rpen.pyファイルを適切なフォルダーにコピーし、適切な権限を付与する必要があります

cp rpen.py /usr/local/bin/rpen
chmod 777 /usr/local/bin/rpen

してみて

ps xau |rpen Ss "S\+" "\?\?" 
3
cray

Sedを使用したバージョンは次のとおりです。単語「FAILED」を赤色にしたい場合、それは次のようになります。

sed 's/\(ERROR\)/\o033[31m\1\o033[39m/'

「FAILED」という単語を含む行全体を赤でマークするには:

sed 's/\(.*ERROR.*\)/\o033[31m\1\o033[39m/'

複数の単語を赤でマークするには:

sed 's/\(ERROR\|FAILED\)/\o033[31m\1\o033[39m/'

複数の単語とその行の行を赤でマークするには:

sed 's/\(.*FAILED.*\|.*ERROR.*\)/\o033[31m\1\o033[39m/'

複数の色を使用するには(ERROR = red/FAILED = blue)

sed -e 's/\(ERROR\)/\o033[31m\1\o033[39m/' -e 's/\(FAILED\)/\o033[34m\1\o033[39m/'

これをすべてssh経由で使用するには:

ssh user@Host -t "tail -n 1024 -f /some/log/file | sed --unbuffered -e 's/\(.*ERROR.*\|.*FAILED.*\)/\o033[31m\1\o033[39m/' -e 's/\(.*postfix.*\|.*dhcpd.*\)/\o033[32m\1\o033[39m/'"

そして、これを毎回入力する必要がないため、bashrcで関数として宣言するだけです。

他の色については、ANSIコードを検索してください。

2
mikeymouse

これはどう? grepでのみ実行できます!ここでのトリックは、(1)検索する単語の/ OR /を使用することです。 (2)-Aおよび-Bオプションを十分な数(ファイルの行数よりも大きい)で使用します。

echo "you make it" > tmp
echo "you take it" >> tmp
echo "you cake it" >> tmp
echo "you bake it" >> tmp
echo "you wake it" >> tmp

GREP_COLOR='1;32' grep -P "(take|cake|bake)" --color=always tmp | GREP_COLOR='1;33' grep -P "(cake|bake)" --color=always -A10000 -B10000 | GREP_COLOR='1;34' grep -P "(bake)" --color=always -A10000 -B10000 
1
user22097

私の答えは以下のとおりです。

tailf logfile awk '/MALE/' {print "\033[34m" $0 "\033[39m"}  '/MALE/' {print "\033[33m" $0 "\033[39m"}
1
Ramin Ismayilli

cxpgrep はこの目的に適しています-パターンを異なる色で強調表示します。

cxpgrep 'PAT1|PAT2|...' FILE_OR_DIRECTORY
1
treulz