色付きのgrep出力:GREP_OPTIONSではなくエイリアスではありません


10

のカラー出力が必要ですgrep

.... だが

  • 戦略1:GREP_OPTIONS。しかし、これは非推奨です。http://www.gnu.org/software/grep/manual/html_node/Environment-Variables.htmlを参照してください
  • 戦略2:GREP_COLORSは一見したところ解決策のように見えますが、これは別のことをします。
  • 戦略3:エイリアス。find ... | xargs grepxargsはエイリアスを評価しないため、これはに対しては機能しません。
  • 戦略4:単純なラッパースクリプトを記述します。いいえ、これは汚すぎるため、解決するよりも問題が多いと思います。
  • 戦略5:ソースコードにパッチを適用する
  • 戦略6:grep開発者に連絡し、GREP_OPTIONSの交換を依頼する
  • 戦略NICE-and-EASY:...これはありません。私は見当もつかない。

これを解決するには?

助けてくれてありがとう!

...しかし、私は賞金を与えることができません

私を失礼、傲慢、侮辱的、虐待的と呼びます....

回避策しかありません-解決策はありません。質問に答える回答はありませんでした。

ご清聴ありがとうございました。


1
ラッパースクリプト(戦略4)を「実際には答えではない」として使用するという2つの提案を拒否しました。それについて「汚い」、「厄介な」、または「本当に答えではない」とは何ですか?多分それは回避できる別の問題です。
JigglyNaga 2017年

2
戦略5は、ソースコードにパッチを適用しcolor_option2 ...に設定ます
don_crissti

2
@JigglyNagaは、ラッパースクリプトが解決策ではない理由を説明しています。私たちのチームはいくつかのサーバーを管理しています。現時点では1000未満ですが、数は増えています。はい、構成管理を使用しており、すべてのスクリプトを簡単に展開できます。しかし、私は物事が簡単でわかりやすいものになりたいと思っています(チームの新しいメンバーを考えてください。混乱させたくありません)。--colorオプションでは、すでに値を持っていますauto。デフォルトでアクティベートできない理由がわかりません。
guettli 2017年

戦略4または5を使用する必要があります-最小限のダッシュ/ shスクリプト(exec grep --color=auto "$@")を使用し、オプションで別の名前(grepcまたはcolorgrep)を使用した戦略4を使用します。これには無視できるオーバーヘッドがあります(実行時に追加の同時プロセスはありません)。それらを「十分に簡単ではない」と分類した理由は、この機能を実装するための(比較的少ない)1回限りの労力を費やすのに十分なほどこの機能が役に立たず、他の誰かがあなたのためにそれを行うことを求めているという事実です。このため、投稿された回答に対する「実際には回答ではない」コメントは非常に失礼です。
名目上の動物

1
@NominalAnimalはい、あなたは正しいです。私はネイティブスピーカーではありません。どの文言(同じメッセージを転送する)が良いでしょうか?
guettli 2017年

回答:


13

OPがオプションが不適切であると述べた理由のいくつかは、実際には根拠がありません。ここでは、OPの戦略4を使用してどのような効果があるかを示します。


ほとんどのディストリビューションでgrepは、は/bin(標準)または/usr/bin(OpenSUSE、おそらく他の)にインストールされており、デフォルトでPATH/usr/local/binbefore /binまたはが含まれています/usr/bin。このユーザーが作成する場合の手段/usr/local/bin/grepでは、

#!/bin/sh
exec /bin/grep --color=auto "$@"

どこ/bin/shあなたのディストリビューションが提供するPOSIX互換のシェルは、通常、bashやダッシュ、です。にある場合grep/usr/bin、それを作成します

#!/bin/sh
exec /usr/bin/grep --color=auto "$@"

このスクリプトのオーバーヘッドは最小限です。このexecステートメントは、スクリプトインタープリターがgrepバイナリーに置き換えられることを意味します。これは、シェルgrepが実行されている間、シェルがメモリに残っていないことを意味します。したがって、唯一のオーバーヘッドは、スクリプトインタープリターの1つの追加の実行、つまり実時間でのわずかな待ち時間です。レイテンシは(だけかどうかによって異なり、ほぼ一定であるgrepsh、ページキャッシュ内かどうか、およびI / O帯域幅が利用可能であるどのくらいの上に既にある)、そしてどのくらいに依存しないgrep、それが処理を実行またはどのくらいのデータ。

それで、その待ち時間、つまりラッパースクリプトによって追加されるオーバーヘッドはどのくらいですか?

調べるには、上記のスクリプトを作成して実行します

time /bin/grep --version
time /usr/local/bin/grep --version

私のマシンでは、前者は(多数の実行にわたって)0.005秒のリアルタイムで実行されますが、後者は0.006秒のリアルタイムで実行されます。したがって、私のマシンでラッパーを使用するオーバーヘッドは、呼び出しごとに0.001秒(またはそれ以下)です。

これは重要ではありません。

また、多くの一般的なアプリケーションとユーティリティが同じアプローチを使用しているため、これについて「汚い」ことは何も見落としています。/binとのマシンでそのようなリストを表示するには、次を/usr/bin実行します

file /bin/* /usr/bin/* | sed -ne 's/:.*shell script.*$//p'

私のマシンでは、上記の出力は、egrepfgrepzgrepwhich7zchromium-browserldd、とxfig、私はかなり頻繁に使用しています。ラッパースクリプトに依存するためにディストリビューション全体を「汚い」と見なさない限り、そのようなラッパースクリプトを「汚い」と見なす理由はありません。


問題に関しては、そのようなラッパースクリプトは以下を引き起こす可能性があります。

人間のユーザ(スクリプトではなく)だけは、グレップのバージョンを使用している場合は出力が端末にある場合はカラーサポートへのデフォルトは、ラッパースクリプトは名前を付けることができることをcolorgrepcgrepやOPはフィットを見ているものは何でも。

これにより、の動作grepがまったく変更されないため、考えられるすべての互換性の問題が回避されます。


grepラッパースクリプトでオプションを有効にするが、新しい問題を回避する方法で:

ラッパースクリプトを簡単に書き換えて、サポートされていなくGREP_OPTSてもカスタムをサポートできますGREP_OPTIONS(既に非推奨であるため)。このようにして、ユーザーは単にexport "GREP_OPTIONS=--color=auto"自分のプロファイルに追加または類似することができます。/usr/local/bin/grep次に

#!/bin/sh
exec /bin/grep $GREP_OPTIONS "$@"

は引用符で囲まれていない$GREP_OPTIONSため、ユーザーは複数のオプションを指定できます。

私のシステムでは、空またはで実行するtime /usr/local/bin/grep --versionと、ラッパースクリプトの以前のバージョンと同じくらい高速です。つまり、通常はplainよりも1ミリ秒長く実行されます。GREP_OPTIONSGREP_OPTIONS=--color=autogrep

この最後のバージョンは、私が個人的に使用することをお勧めするバージョンです。


要約すると、OPの戦略4:

  • grep開発者から推奨されています

  • 実装するのは簡単です(2行)

  • わずかなオーバーヘッドがあります(この特定のラップトップでの呼び出しごとに1ミリ秒の追加レイテンシ。各マシンで簡単に確認できます)

  • GREP_OPTSサポートを追加するラッパースクリプトとして実装できます(非推奨/非サポートを置き換えるためGREP_OPTIONS

  • スクリプトまたは既存のユーザーにまったく影響を与えない(colorgrep/ としてcgrep)実装可能

これはすでにLinuxディストリビューションで広く使用されている手法であるため、「ダーティー」ではなく一般的な手法です。

個別のラッパー(colorgrep/ cgrep)として実装した場合、grep動作にまったく影響しないため、新しい問題を作成できません。GREP_OPTSサポートを追加するラッパースクリプトとして実装された場合、使用にGREP_OPTS=--color=autoは、上流のデフォルト--color=autoを追加する場合とまったく同じリスク(既存のスクリプトに関する問題)があります。したがって、これが「解決するよりも多くの問題を作成する」というコメントは完全に正しくありません。追加の問題は作成されません。


3

あなたが最初の戦略で提供するドキュメントは言う:

代わりにエイリアスまたはスクリプトを使用してください。たとえば、grepがディレクトリ '/ usr / bin'にある場合、$ HOME / binをPATHの前に追加して、以下を含む実行可能スクリプト$ HOME / bin / grepを作成できます。

#! /bin/sh
export PATH=/usr/bin
exec grep --color=auto --devices=skip "$@"

したがって、エイリアスが不可能な場合は、ラッパースクリプトが唯一の方法です。


それは戦略4です...本当に答えではありません。
guettli 2017年

3

GREP_OPTIONS変数が廃止された理由はgrep、スクリプトのどこかで呼び出されたときに問題が発生する傾向があり、スクリプトが変数からの代替オプションで機能しないためです。ラッパースクリプトを作成する場合、別の名前を付けない限りgrep、同じ問題が発生します

$ cat ~/bin/cgrep
#!/bin/sh
exec grep --color=always "$@"
$ find  -exec cgrep  {} +

または、お気に入りのオプションを変数に保存します。zsh以外のシェルでは、オプションにワイルドカード文字(\[*?)が含まれている場合、これは面倒ですが、それ以外の場合は、引用符で囲まれていない変数を使用して、引数付きのコマンドを取得できます。

cgrep=(grep --color=always)
find  -exec $cgrep  {} +

GNUとBSDのgrepはディレクトリツリーを再帰的に処理できることに注意してください。これにより、ほとんどの場合findと組み合わせる必要がなくなりgrepます。


1
それは戦略4です...本当に答えではありません。
guettli 2017年

@guettli、それが正解です。異なる動作grepのコマンドが必要な場合、別の名前のコマンドが必要な場合、または同じ名前を保持している場合は、元の/標準の動作を期待するスクリプトを中断します。これは最もクリーンで、追加の問題を引き起こしません。
ステファンChazelas

@StéphaneChazelasはい、あなたは正しいです。これはあなたの見解によると正しい答えです。
guettli 2017年

1

最も簡単な方法は、エイリアスを使用することです(戦略3)。xargsコマンドを本当に気にしている場合でも、bash関数でオーバーライドできます。

alias grep='grep --color'
xargs() {
    local args
    for ((i=1; i<=$#; i++))
    do
            if [[ "-E -L -P -I -s -d" == *"${!i}"* ]]; then
                    ((i=i+1))
            elif [[ ${!i:0:1} != "-" ]]; then
                    if [[ ${!i} == "grep" ]]; then
                            args="--color"
                    fi
                    /usr/bin/xargs ${@:1:i} $args ${@:i+1}
                    return;
            fi
    done
}

しかし、これは、grepチームが推奨するソリューションのように思われるラッパーコマンドを使用するよりは良くありません。

/usr/local/bin/grep:

#!/bin/bash
/bin/grep --color "$@"

私の控えめな意見では、grep開発者チームに連絡して、環境変数GREP_OPTIONSgrep応じて色を有効にする変数の簡単な置き換えを提供するよう依頼する必要があります。

彼らがデフォルトでcolorオプションを有効にするのは非常に簡単ですGREP_COLORS


1
「... grep開発者チームに連絡する必要があります...」ありがとうございます。これは私に肯定的なフィードバックを与えます。ここで何かが足りないと思っているのは私だけではないことを知っています。
guettli 2017年

私はあなたのコメント「...あなたはgrep開発者チームに連絡すべきです...」を戦略6として質問に追加しました。これまでのところ、これが私のお気に入りの答えです。
guettli 2017年

0

これは@NominalAnimalによるトップアンサーからの解決策ですが、通常のgrep: ...警告が(の代わりに/bin/grep: ...)あります:

#!/bin/bash
exec -a grep /bin/grep --color=auto "$@"

ラッパーの書き方を知っています。このコンテキストでは、ラッパーはソリューションではありません。
guettli

@guettliええと、答えはあなたの状況に正確に対処することを意図したものではありません...コメントが答えと同じフォーマット機能を持っている場合、それはコメントになります。(そして、私は同様の編集を元の作者または何かによって意図されていないとして拒否されました。)あなたの状況に関して、私はあなたの質問に対する適切な文字通りの答えは別の「戦略NICE-and-EASY」が存在しないことだと思います。
Kirill Bulygin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.