grepの出力を色付きのファイルに保存する


36

grepコマンドの結果をファイルに保存する必要がありますが、出力ファイルをフォーマットして、端末の場合と同じように色を保持する必要もあります。

それを行う方法はありますか?grepをある種のマークアップ言語に保存するのでしょうか?それが不可能な場合、このタスクを達成できる別のツールはありますか?

ターミナルとまったく同じように、出力ファイルで検索キーワードを目立たせようとしています。

回答:


43

マークアップを維持するには、単なるテキストファイル以上のものが必要です。色を保持するためにHTML出力を使用します。

  • aha ieをインストールして、「unix端末の ANSIエスケープシーケンスをHTMLコードに変換する」

    sudo apt-get install aha
  • 次に、次のようにgrep(またはls)出力を保存します。

    ls --color=always | aha --black --title 'ls-with-colors' > ls-with-colors.html

    オプション:

    --black param to set background as black color
    --title param to set the title for HTML page

を介したファイル拡張子の構文ハイライト pygmentize

  • インストールpygmentize

    sudo apt-get install python-pygments
  • 次に、この種類のコマンドを実行します。

    pygmentize file.pl | grep -i --color=always version | aha --black > ls-with-colors.html

ここに画像の説明を入力してください


1
あは!! ahaは本当に素晴らしいツールです。まさに私が探していたものです、ありがとう!!
全能のラクダモハ14

2
@ Mhd.Tahawi:コードの色(あなたの場合はperl)を維持できるように回答を更新しましたが、pygmentize他の多くのユーザーと連携します。
シルヴァンピノー14

10

出力ファイルをどのように処理したいかによっては、色が特殊文字に由来するため、通常のテキストファイルに色を追加することができます。Grepは、ファイルにリダイレクトするときにそれらを印刷したくないようです。そのため、次のように強制する必要があります。

grep --color=always "stuff" input.txt > output.txt

これで、ファイルをコンソールに印刷すると、Bashはこれらの文字を「この色を使用」と解釈するため、色付きで印刷されます。

cat output.txt

ただし、のようなエディターで開くと、vim奇妙な文字が表示されます。たとえば、コマンドを使用するとき

echo "A sentence. A red sentence. Another sentence." \
  | grep --color=always "A red sentence" > output.txt

出力は、私が使用して印刷するとき、右に見えるcat中で、私はそれを開いたときにはvim、私が得ます

A sentence. ^[[01;31m^[[KA red sentence^[[m^[[K. Another sentence.

そのため、エディターを使用したい場合、これはおそらく望みのものではありません。


正しい!!、私はその間に奇妙なシンボルを取得していましたが、それらが何であるか理解していませんでした。
全能のラクダモハ14

私はあなたの答えがどれほどシンプル/効果的であるかが本当に好きです。出力をcatするだけです:)。これは短期的には素晴らしいことです(今のところ私にとっては十分です)。
トレバーボイドスミス

詳細:カラーエスケープシーケンス(別名奇妙な文字)を解釈するのは、bashではなく端末(エミュレータ)です。
-masterxilo

2

正しく理解できたら、ターミナル出力をテキストファイルに保存したいですか?しかし、色でフォーマットする必要があります。その場合、私のアイデアは次のとおりです。

出力を自動的に強調表示する

おそらくご存知のように、grep出力をテキストファイルにキャプチャした場合、それがテキストファイルであるという理由だけでフォーマットできません。したがって、私が知る限り、簡単な方法でそれを行うことはできません。

それにもかかわらず、簡単な回避策があります。これは、どの種類のファイルが開いているかをテキストエディターに認識させることから成ります。たとえば、grep出力にbashコンポーネントがあるため、bashの強調表示が機能するとします(ちなみに、これらは多くの場合、ターミナルの色付き出力に表示される色です)。そのため、テキスト出力を適切な拡張子を持つファイルに保存するのがコツです。次のようなことをする代わりに:

ls | grep something > output

あなたは行くかもしれません

ls | grep something > output.sh

これにより、gedit(または適切なテキストエディタ)は、bashコードについて話していることを自動的に認識し、それに応じて強調表示します。出力に色を付ける必要はありません。開いているコードの種類を認識すると、プログラムがそれを行います。他のタイプのフォーマットを使用している場合は、拡張機能を、目的とするものに合わせて拡張機能を調整するだけです(たとえば、> output.xml、> output.html、> output.pyなど)。がんばろう!:)

出力ファイル内のいくつかの単語を強調表示する

だから、もし私がそれを手に入れたなら、あなたはあなたが検索した言葉を強調したい。繰り返しますが、プレーンテキストであるという理由だけで、プレーンテキストファイルでそれを行うことはできません。ただし、HTMLコーディングを使用するなど、非常に簡単な方法でフォーマットを追加できます。これにより、出力がhtmlコードに変換され、htmlを解釈できるプログラム(libreoffice writer、firefox、10000 etceteras)で出力を開くと、いくつかの単語が強調表示されます。

そのために、これがhtmlにエクスポートされたgrepであるとしましょう:

ls | grep keytext > output.html

次に、出力でキーテキストを強調表示する必要があります。次のように、sedを使用して実行できます。

sed -i 's/keytext/<font color="red">keytext<\/font>/g' output.html

これで、キーテキストが赤で強調表示されます。


1
いいアイデア!!ですが、構文の強調表示は探していません。grepが検索キーワードを別の色(通常は赤)で色付けする方法を知っています。出力ファイルでキーワードを際立たせるようにしたいのです。
全能のラクダモハ14

わかりましたので、あなたは色で何かをグレープしていますか?HTMLコードのような?入力に色が表示されている場合は、フォーマットする必要があるため、「fontcolor:red」などのどこかにコーディングする必要がありますか?この場合、grepにフォーマットコードを含める必要があります。:)
ロー14

わかりました、質問の編集で私はそれを得ます。:)どの出力拡張機能を使用していますか?
ロー14

私はperl拡張機能を使用したときにperlコードをgreppingし、完全な構文カラーリングを取得し、変数名をgrepingして、カラーリングさえしませんでした。
全能のラクダモハ14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.