`highlight`コマンド


11

文字列全体をstdoutに渡しながら、stdin内の特定の文字列を(色、太字のテキスト、または反転したバック/フォアグラウンドで)簡単に強調表示するために使用できるコマンドはありますか?私はそれ構築することを考えていますが、それがすでに存在する場合はむしろそれを使用したいです。いくつかの望ましい機能:

  1. 個別のハイライト文字列は、自動的に別の方法でハイライトされます。たとえば、手動で設定しない場合、最初の文字列は赤、2番目は緑、3番目は青で強調表示されます
  2. カラーサポートを検出し、太字/反転/その他の強調表示方法が利用できる場合はそれらにフォールバックします。
  3. 正規表現とリテラル文字列のマッチングを可能にします。
  4. "foobar"と "barbar"のように、一致が重複する場合は、賢い処理を行うことが望ましい。
  5. カラーコードの追加を除いて、stdinとstdoutの間で何も変更されません。


ああ、いい質問です。私はこれを正確に必要として何かを書いてしまいましたが、固定文字列を色分けしただけで、リストした機能がありませんでした
Michael Mrozek

新しいユーティリティを作成するのではなく、これをgrep自体への追加として見るとすごいです。
mattdm 2011年

1
適切なUNIXの哲学は、grepだけでなく他のストリームからもパイプスルーできる新しいユーティリティです。しかし、おそらくこれを実行できるPerlモジュールが少なくとも1つ以上あると思います...
Shadur

1
@ギレス:その質問は、範囲がはるかに限定されています。実際、それを読むことが私がこの質問を作成した理由の1つでした-より一般的で柔軟な解決策を求めることです。
l0b0 2011年

回答:


4

たぶん、ラドバンガラビックのGeneric Colouriser(grc)?引数として設定ファイルが必要であり、正規表現で動作します。だから、完全に設定なしではありませんが、プロセスプロセス置換(<(list))を使用できるので、手動設定なしで必ず:-)


ページを開かずに(そして検索可能にするために)明確にするために、 "this one" == Generic Colouriser ; grcgrcat ...おかげで、私はそれが好きです。
Peter.O

grcヘルパースクリプトがあります:grcat。以下は、すべての大文字を赤で着色する例です。ステップ1:設定ファイルをセットアップします:printf "regexp=[A-Z]\ncolours=red\n" > ~/.grc/red-caps ステップ2; それを使用する:echo Hello World | grcat red-caps...マニュアルページには、検索する3つのconfigディレクトリが記載されており、configファイルは絶対パスである可能性があることが示唆されています(?)バージョン1.3)
Peter.O

5

救いの手を差し伸べる!

これは(本当に必要なときに)改善できますが、かなりうまく機能します。

$ cat >~/bin/hilight <<EOF
#!/bin/bash
while [ $# -gt 0 ]
do
 COMANDO=$COMANDO's/'$1$'/\033[01;'$2$'m\033[K\\0\033[m\033[K/g\n'
 shift;shift;
done

sed -e "$COMANDO"
EOF

簡単にするために、hilightは引数のペアを受け入れます(最初に一致、2番目に色)このスクリプトでは、属性は常に太字です

man console_codes(グラフィックレンディション)を読んでカラーエスケープセキュリティを確認するか、これを試してください

for attrib in $(seq 0 12); do
  for color in $(seq 30 37) $(seq 40 47) $(seq 90 97); do
    printf %b " $attrib $color:\033[$attrib;${color}mhi, dudes\033[m"
  done
done

これを使用すると、次のような重要な欠点があります。

$ dmesg | hilight \\[ 34 ] 34

しかし、これはまったくありません:

$ dmesg | hilight \\[ 34 ] 34 [[:digit:]] 31

[:digit:]は、以前の自殺のエスケープグループ内の数字を検索するためです。

何かのようなもの:

$ cat /var/log/kern.log | hilight kernel 31 a 34 et 33

常に例外として機能します。

timeコマンドを使用すると、経過時間に4の増分があることがわかりました。

sedコマンドを、好きな、またはニーズに合った他のパーサー(awkなど)に置き換えることができます。


2

また、次のように、印刷不能文字のすべての行に一致するパターンでegrepを使用することもできます。

dmesg | egrep --color "swap|$"

1

clideは正常に 動作します。EPELリポジトリーのRHEL 6.2で使用します


とても良いツールの+1。残念ながら、必要なすべての機能が備わっているわけではありません。
l0b0 2012

1

のバージョンにgrep色が付いている場合は、正規表現の変更を使用してgrepでテキストを強調表示し、すべての行を一致させて何も除外されないようにすることができます。次の方法でうまくいくはずです。

<your command> |grep "highlightme\|^"

0

リンクで言及したように、grep --color=always1つのパターンに対してのみ機能します。そうは言っても、そのようなツールが存在するとは思わない。


0

私はhttp://em.readthedocs.org/を使用しています。Pythonにより、さまざまなプラットフォームに簡単にインストールできます。シンプルで問題なく動作します。


Unix&Linux Stack Exchangeへようこそ!これは理論的には質問に回答するかもしれませんが、回答の重要な部分をここに含め、参照用のリンクを提供することが望ましいでしょう
slm

1
ヘルプセンターによると、「しかし、あなたはあなたの答えの中であなたの所属を開示しなければなりません。」あなたがを書いたIgor Kalnitskyと同じでemある場合は、ユーザーではなく提案されたツールの作成者ではないことを明確にするために、回答を書き直してください。
manatwork 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.