GNU grepを使用して一致を強調表示するにはどうすればよいですか?


18

一部のLinuxでgrep、一致を強調表示し、一致するファイルを印刷するように構成されています。

grep一致を強調表示するように構成するにはどうすればよいですか?

回答:


10
alias cgrep='grep -nR --color'

使用法:

$ cgrep somestring /path/to/dir/or/file/with*/possible/*wild.card

私のお気に入りの1つ:

$ pgrep some-hanging-process

次の状況で使用できるsome-hanging-processの名前に一致するプロセスのすべてのpidをリストします。

$ kill $(pgrep some-hanging-process)

12
最後の1
つのための

1
GNUの最近のバージョンではgrepgrep -r一般的に好まれるべきgrep -R前者はシンボリックリンクを経由しないと。
ステファンシャゼル14

19

grepをポン引きする最良の方法は、ackを使用することであることがわかりました。 perl正規表現。これは、grepが時間の98.6%を実行したいことです。


5
ackに言及する場合は+1。ページ分割された結果の強調表示を維持するために、--pager = "less -R"オプションを含めることを忘れないでください。また、Ubuntuでは、「ack」が取得されるため、「ack-grep」と呼ばれることにも言及する価値があります。
ショーンチン

私もackを使用していますが、利用できない場合があります。
elmarco

2
ACKがただのperlスクリプトですので、あなたができること、高いバーではありませんあなたはperlのインストールされている利用可能どこでも、作ります。
カイ

Ackはそのまま使用できるデフォルト設定には適していますが、ackをインストールするときに、grepのデフォルト設定を行うことができます。このページの別の場所にある私の回答を参照してください。私は1980年代にこれを1回行いました。それ以来、grepはackが行うすべてを実行しました。(反対に大声で主張するにもかかわらず、grepだけが実際に高速です)
ジョナサンハートリー

7

エイリアスを使用してgrepを再定義する代わりに、これを.bashrcに設定します。

    export GREP_OPTIONS="--color=auto"

私にとって、これはLinux、MacOSX、FreeBSDで動作します。


GREP_OPTIONS有害とみなされるべきです。alias代わりに使用することをお勧めします。こちらをご覧ください:bugs.launchpad.net/ubuntu/+bug/67141
lesmana

GREP_OPTIONSは特定のスクリプトで問題になる可能性があることに同意します。しかし、バグ67141で議論したように、GREP_OPTIONSはユーザーが多くの形式のgrep(grep、egrep、fgrep、rgrep、zgrep、bzgrep、bzfgrep、bzegrepなど)に対して1つのオプションを設定できるようにします。 * grepのすべての形式、およびgrepには多くのタイプがあります。
ステファンLasiewski

GREP_OPTIONSを何年も(何十年も)使用していましたが、それが引き起こす害は非常に現実的です。このenv変数を設定してgrepを呼び出すツールは、変更されたデフォルトの動作を継承します。これにより、これらのツールが破損します。代わりにエイリアスまたは実行可能なラッパースクリプトを定義することにより、この問題を完全に回避してください。
ジョナサンハートリー

スクリプト環境をサニタイズする必要があります。ifs、buts、またはhowsは許可されていません。限目。(はい、それは腰の王室の痛みです...)。
フォンブランド

3

環境変数GREP_OPTIONSを避ける​​ことをお勧めします。これは、他のツールに組み込まれているものも含め、grepのすべての呼び出しに影響します。これらのツールがgrepが一方向に動作することを期待している場合、その動作を変更すると、それらのツールが破壊されます。

代わりに、エイリアスを作成できます。これはうまく機能します。これは、対話型シェルからのgrepの呼び出し(つまり、自分で入力する)にのみ影響します。

私が一番気に入っている最後のオプションは、grepを呼び出すラッパースクリプトを作成することです。他のプログラムからこのラッパーを呼び出すことができるので、エイリアスよりもこれを好みます。たとえば、vimgrepを設定してvimを実行すると、vim内からの検索はコマンドラインでの検索と同じように動作します。

$ cat `which grp`
#!/usr/bin/env bash
grep -rI --color --exclude-dir=\.bzr --exclude-dir=\.git --exclude-dir=\.hg --exclude-dir=\.svn --exclude-dir=build --exclude-dir=dist --exclude=tags $*

以下を使用してこれを呼び出します。

$ grp pattern dir

例えば

$ grp pattern .

現在のディレクトリとサブディレクトリ内のすべてのテキストファイルで「パターン」のインスタンスを検索します。

「grep」をシャドウするのではなく、スクリプトを「grp」と呼ぶことに注意してください。これにより、カスタマイズしたデフォルトでgrepを呼び出すかどうかを常に認識できます。

デフォルトでは、次を含めます。

-r : search subdirs recursive
-I : skip binary files
--color : highlight matches in color
--exclude-dir : skip specified directories and their subdirs
--exclude : skip specified files

私は誰もがソース管理ディレクトリをスキップしたいと思うと思います:.hg .git .bzr .svn

「build」と「dist」をスキップすることはPython主義であり、おそらくほとんどの人には当てはまりません。間違いなく、仕事をしながら独自の特異性を身に付けていくでしょう。

「タグ」はctagsの出力で、vimなどのツールで「関数定義に移動」などに使用します。そのため、ソースコードのすべての単語と記号の少なくとも1つのコピーが含まれているため、検索結果からスキップする価値があります。

末尾の「$ *」は「およびコマンドラインからの他のすべてのパラメーター」のbash構文であるため、パターンとdirを渡して通常どおりに検索し、必要な他のコマンドラインフラグをオーバーライドできます。 。


2

この--colorオプションは既に何度か言及されていますが、環境変数を使用して一致が強調表示される色を構成できることを追加したいと思います

export GREP_COLOR="1;33"

カラーは、参照用にANSIカラーコードを使用してエンコードする必要があります

Black       0;30     Dark Gray     1;30
Blue        0;34     Light Blue    1;34
Green       0;32     Light Green   1;32
Cyan        0;36     Light Cyan    1;36
Red         0;31     Light Red     1;31
Purple      0;35     Light Purple  1;35
Brown       0;33     Yellow        1;33
Light Gray  0;37     White         1;37

1
GREP_COLOR非推奨です。GREP_COLORS代わりに使用してください。
g33kz0r

2

実際に色を設定する例は見なかったので、GNU grepの簡単なセットアップを次に示します。

# turn on colors, natch.
export GREP_OPTIONS="--color=auto"

if [[ $(echotc Co) -ge 256 ]]; then
  # 256 color terminals
  export GREP_COLORS="mt=38;5;118:sl=:cx=:fn=38;5;18:ln=1;30:bn=37:se=30"
else
  # everybody else
  export GREP_COLORS="mt=31:sl=:cx=:fn=34:ln=1;30:bn=30:se=30"
fi

次のことに注意してくださいGREP_OPTIONS。のようなもの以外には使用しないでください。そうしない--color=autoと、システムでgrepを使用するスクリプトが台無しになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.