grep
AND関数を実装する方法はありますか?私の言葉はこれです:
次の行があります。
I have this one line
I don't have this other line
I have this new line now
I don't have this other new line
This line is new
grep
だから、「new line」だけでなく、「new」と「line」という単語の両方を含む行を探したいと思います。私はこれができることを知っています:
grep new file | grep line
しかし、それは私が探しているものではありません。 1つのコマンドでこれを実行したいと思いますgrep
。これは、スクリプトがユーザーに両方の用語を入力するように要求し、いずれかの用語が空である可能性があるため、エラーが発生してスクリプトが中断されるためgrep
です。
答え1
空または設定されていない場合は、2番目の項目を実行しないでくださいgrep
。
grep -e "$term1" <file |
if [ -n "$term2" ]; then
grep -e "$term2"
else
cat
fi
これはgrep
、呼び出されたファイルのパターンを適用し、空でないかどうかに応じて結果に2番目のパターンを適用するか、パススルーフィルタとして機能します。$term1
file
$term2
grep
cat
これは、空のときに「」に変質することを除いて、「term1
AND term2
」を効果的に実装します。term2
term1
まったく実行したくないが、grep
2番目の項目が空の場合は空の結果を返す場合:
if [ -n "$term2" ]; then
grep -e "$term1" <file | grep -e "$term2"
fi
term1
これは「AND」を効果的に実装し、nullを「false」term2
として扱います。term2
これの利点は、標準にのみ依存し、grep
両方のモードが独立して維持されるため、理解して維持するのが簡単であることです。
答え2
これは動作します(GNUを使用grep
):
grep -P '(?<=new)\s(?=line)' file
テスト:
$ cat > file
I have this one line
I don't have this other line
I have this new line now
I don't have this other new line
This line is new
^D
$ grep -P '(?<=new)\s(?=line)' file
I have this new line now
I don't have this other new line
答え3
man grep
「接続」と「代替」を組み合わせてみてください。
P1=line
P2=new
grep "$P1.*$P2\|$P2.*$P1" file
I have this new line now
I don't have this other new line
This line is new