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を表すには、各正規表現パターンを(パイプ)で区切るだけです。