2つ以上のパターンを持つテキストファイルに対してgrep
を実行するエレガントな方法がbashにあり、一致する各パターンは異なる色で出力されますか?
MALE
とAUGUST
で一致する行は、青のMALE
とオレンジのAUGUST
を出力しますか? sed
、awk
、grep
、およびクレヨンなどの使用を受け入れています。
--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.*$|$'
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
)でグローバルに置き換えます。すべての可能な一致を処理した後、行を明示的に印刷する必要があります。
すぐに使えるものが必要な場合は、おそらく hhighlighter を探しているでしょう。
次に例を示します。
ご覧ください。単語を異なる色で自動的に色付けするのに非常に便利です。 ack の上に構築された印象的なプロジェクトです。
テキストファイル内の文字列を強調表示する必要があり、自分のニーズに合った方法が見つからなかったため、正規表現に一致する文字列を色付けする簡単な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番目の文字列よりも優先度が高くなります...
お役に立てれば。
素晴らしい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\+" "\?\?"
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コードを検索してください。
これはどう? 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
私の答えは以下のとおりです。
tailf logfile awk '/MALE/' {print "\033[34m" $0 "\033[39m"} '/MALE/' {print "\033[33m" $0 "\033[39m"}
cxpgrep はこの目的に適しています-パターンを異なる色で強調表示します。
cxpgrep 'PAT1|PAT2|...' FILE_OR_DIRECTORY