各grepコマンドで、結果を異なる色で強調表示しようとしています。私はこのような行で手動でそれを行うことができます:
ls -l GREP_COLORS='mt=01;32' grep c | GREP_COLORS='mt=01;31' grep o | GREP_COLORS='mt=01;34' grep n | GREP_COLORS='mt=01;36' grep f
すべてのc
文字が緑で強調表示され、すべてのo
文字が赤で強調表示されます。
この例が機能するためには、常に
--color=always
grepコマンドを使用する必要があり ます。私はこれを私の中で設定した.bashrc
ので、grepは常に色を持っています:
export GREP_OPTIONS='--color=always'
私が達成しようとしているのは、この機能をエイリアスでラップgrep
して、GREP_COLORS
毎回呼び出して異なる値を設定できるようにすることです。パイプされた新しいgrepごとに複数のシェルの考慮事項を理解し、いくつかのファイル(各色に1つ)を作成してこれを克服しようとして、既に使用されていることを示します。
私はいくつかの試みをしましたが、奇妙なことに、これは「最高」に機能するようです。私はこれを持っています.bashrc
:
alias mg="mygrep"
mygrep(){
# define possible colors
COLORS=("01;32" "01;31" "01;34" "01;36")
COUNTER=0
NUM=0
# as long as the color has already been used, keep searching
while [ -f /home/lior/Desktop/mygrep_$NUM ]; do
# get a random index
let NUM=`shuf --input-range=0-$(( ${#COLORS[*]} - 1 )) | head -1`
wait ${!}
$(( COUNTER+=1 ))
if [ "$COUNTER" -ge ${#COLORS[@]} ]; then
# remove all color locks
rm /home/lior/Desktop/mygrep_*
wait ${!}
fi
done
# mark this color as used
touch /home/lior/Desktop/mygrep_$NUM
wait ${!}
# lets go!
GREP_COLORS="mt=${COLORS[$NUM]}" grep "$@"
}
私はこのエイリアスを次のように使用しています:
ll | mg c | mg o | mg n | mg f
結果は非常にクールです。ただし、毎回わずかに異なるいくつかのエラーがあります。以下にスクリーンショットをいくつか示します。
シェルが各パイプコマンドを通過するときに、前の関数がまだ実行を完了していないように見えます。もう存在しないファイルを削除しようとします。私はそれらの他のcommand not found
エラーがどこから来ているのかよく分かりません。
ご覧のとおりwait
、ファイル操作を完了させるためにいくつかのコマンドを入力しましたが、これはあまりうまく機能していないようです。もう1つ試したのは、共有メモリを使用する/dev/shm
ことですが、同様の結果が得られました。
必要な結果を得るにはどうすればよいですか?
注意:
使用したい機能がたくさんあり、パイプの間に他のロジックを挿入するつもりなので、単にgrepコマンドをラップする回答を探しています。他の「grep like」ツールも探していません。素晴らしいperlの提案をすでに投稿している@terdonに申し訳ありません。
alias mg="mygrep; grep"
か?
mygrep;
はそれ自体で新しいコマンドに変わり、データストリームが失われることです。からの着信パイプはgrepにls
渡されmygrep;
、grepには渡されません。少なくともそれは私がそれを理解する方法です。
--color=always
すべてのgrepコマンドを確実に実行する必要があります。私はそれをグローバルに設定しました.bashrc
。これを編集して投稿しました。