以前の回答に基づく新しいコマンド

以前の回答に基づく新しいコマンド

grep単一の基準を使用して順序に関係なく、複数のパターンに一致する項目を検索する方法はありますか?

図からわかるように複数のANDパターンでgrepを実行する方法は?複数モードの場合に使用できます

grep -e 'foo.*bar' -e 'bar.*foo'

ところでここでは2つの条件を書かなければならず、3つのパターンに6つの条件を書かなければならないように… できれば単一の条件を書きたいと思います。任意の順序でパターンを見つけるには、次のように提案できます。

grep -e 'foo' | grep -e 'bar' # at least i do not retype patterns here

これはうまくいきますが、カラー出力を見たいです。この場合のみバー強調表示されます。

私が書きたい条件はとても簡単です。

awk '/foo/ && /bar/'

可能であればgrep(awkは結果を強調しないので、簡単に実行できるかどうか疑問です)。

agrepたぶん私が望むことができるかもしれませんが、Ubuntu 12.04のデフォルトのgrep(2.10-1)がこれを行うことができるかどうかを知りたいです。

答え1

あなたのバージョンがPCREをサポートしている場合grep(GNUはまたはオプションをgrep使用してこれを行う)、プレビューを使用して順序に関係なく複数の単語を一致させることができます。-P--perl-regexp

grep -P '(?=.*?word1)(?=.*?word2)(?=.*?word3)^.*$'

しかし、これは言葉を強調しません。プレビューは、一致するシーケンスの一部ではない長さゼロのアサーションです。

あなたのパイプソリューションはここで動作する必要があると思います。grepデフォルトでは、出力は端末に到達したときにのみ色付けされているため、パイプラインの最後のコマンドのみが強調表示されますが、使用できます--color=always

grep --color=always foo | grep --color=always bar

答え2

以前の回答に基づく新しいコマンド

#!/bin/bash
# Build search pipeline
n=$#
SEARCH=""
while [ $n -gt 0 ]; do
    if [ -n "$SEARCH" ]; then
            SEARCH="|${SEARCH}"
    fi
    SEARCH="grep --color=always '${!n}'${SEARCH}"
    n=$[ $n - 1 ]
done
# Execute all greps in sequence
/bin/bash -c "${SEARCH}"

したがって要求されたように:

私が書きたい条件はとても簡単です。awk '/foo/ && /bar/'

yagrep SEARCH grep color < /usr/local/bin/yagrep

探す==grep-=常に '${!n}'${探す} "

古い回答

洗練されたオプションは、パターンのすべての置換を生成し、それをgrep正規表現コンパイラに提供し、合理的に最適化された検索ツリーを生成することです。

でもパターン数が6個といっても順列は6個になります!または720。これにより、コマンドラインがぎこちなくなる可能性があります。

grepしかし、パイプライン以外に他の問題はないようです。

これはうまくいきますが、カラー出力を見たいです。

次に、前提は:

  • パターンが重ならない
  • パターンに用語制御文字が含まれていません。

許容可能な解決策は、grep可能性が高くなる順序で、それぞれパターンを持つ複数のsをパイプして負荷を最小限に抑えることです。

その後、色が正しく機能していることを確認するには、grep強制的に標準出力が端末であると信じてください。または、他の方法を使用するfaketermか、使用可能な場合(必要な場合)、次の--color=alwaysオプションを使用できます。

cat file | grep --color=always pattern1 \
         | grep --color=always pattern2 \
         ...
         | grep --color=always patternN 

(良い方法は、grepサブシェルによる実行のためにsを単一の文字列にラップし、たとえばプログラムで文字列を生成することですsed。)

答え3

以下を使用して出力に色を割り当てることができます。sed

sed -n "/foo/{/bar/s/foo\|bar/\x1b[1;31m&\x1b[m/gp}"

答え4

単一のORベースの正規表現を使用してこれを実行できます。与えられたファイルの内容:

This is my file
It has many words
There are also many chars

次のgrepコマンドは、単一のパラメータで「my」と「There」を強調表示します。

grep -P -e '(there|my)' testfile

|ORを表すには、各正規表現パターンを(パイプ)で区切るだけです。

関連情報