grep -fで一致するパターンの代わりに一致結果が出たパターンを印刷できますか?

grep -fで一致するパターンの代わりに一致結果が出たパターンを印刷できますか?

コマンドは、最後の一致文字列ではなくgrep -f input_pat.txt match_in.txt一致パターンを印刷する方法を探しています。input_pat.txtmatched_in.txt

たとえば、次のようにinput_pat.txtなります。

abc...blahblah

そしてmatch_in.txt

abcdefblahblah

"abc...blahblah"印刷物に印刷したいです。

答え1

grepを2回呼び出すと実行できます。少し高価ですが、作業は完了です。パターンファイルがpat.txtで、検索したいファイルがdata.txtであるとしましょう。

paste <(grep -o -f pat.txt  data.txt ) <(grep -f pat.txt data.txt )

両方のコマンドの両方の出力がファイルとして処理さ<( ... )れるように、プロセス置換を使用します。paste最初のコマンドでは、-oオプションは一致するパターンのみを印刷します。 2番目のコマンドは、完全に一致する行を印刷します。

順序は1対1なので、2つの出力を並べて貼り付けるのは安全です(grepを実行するときにスキーマファイルやデータファイルが変更されていないと仮定)。

答え2

拡張正規表現(例grep -E:)に切り替えることが許可されている場合は、awk逆のアプローチを使用して次のことを実行できます。

awk '
  !end_of_re_list {if (!(re[$0]++)) n++; next}
  {
    for (i in re)
      if ($0 ~ i) {
        print i
        delete re[i]
        if (--n == 0) exit
      }
  }' input_pat.txt end_of_re_list=1 match_in.txt

関連情報