grepはいくつかのパラメータを見つけましたが、発生順に出力します。

grepはいくつかのパラメータを見つけましたが、発生順に出力します。

出力ファイルの内容をgrepしたいです。たとえばabcd

ファイルは次のようになります。

asdf
ab
hgr
cd
ab
asdsda

今私が次のようにab1つずつgrepするならcd

for i in $@
do
  grep $i file
done

わかりました。

ab
ab
cd

私が望むもの

ab
cd
ab

エレガントな解決策はありますか?

ベストアンサー1

この結果を得る理由は、ループが最初の反復で発生したすべてのケースを最初に実行して返し、次にループが最初の反復で発生したすべてのgrep ab fileケースを実行して返すためです。abgrep cd filecdfile

forループは必要ありません。この試み:

grep -e "^ab$" -e "^cd$" file

または、-xオプションを使用して行全体と正確に一致する一致のみを選択します(man grep、thx〜先行は達成するのが難しい):

grep -x -e "ab" -e "cd" file

出力は次のとおりです。

ab
cd
ab

または(GNUgrepまたは互換性が\|標準BRE演算子ではないと仮定):

grep "^\(ab\|cd\)$" file

GNUと同じsed

sed '/^\(ab\|cd\)$/!d' file

おすすめ記事