複数キーワード検索 OR

前回は、指定した複数のキーワードをすべて含む行を表示する方法について説明しました。今回は、A か B のどちらかが含まれればいいという条件を指定する方法について紹介します。

--le オプションの ? 指定

前回と同じ寿司セットの検索を考えます。

サービスセット      熟成まぐろ えび たまご いか サーモン いなり ねぎまぐろ サラダ
お子様セット        熟成まぐろ えび たまご いなり ツナサラダ
特上セット          中とろ 熟成まぐろ 熟成真鯛 はまち 赤えび ほたて うなぎ かに いくら
特上極旨セット      中とろ はまち かに いくら 赤えび サーモン うなぎ うに
うどんセット        熟成まぐろ サーモン たまご えび うどん
サラダ軍艦セット    えびマヨ ツナサラダ サラダ シーフードサラダ
人気セット          熟成まぐろ 漬けまぐろ サーモン びんちょう いか えび えびアボカド たまご
まぐろづくしセット  中とろ 熟成まぐろ ねぎまぐろ
プレミアムセット    中とろ まぐろ サーモン 赤えび はまち うなぎ かに いくら

前回はまぐろはまちの両方を含むセットを探しましたが、はまちが入っているセットは少ないので選択肢が限られます。妥協して、代わりにえびでもいいことにしましょう。

このような場合は、次のようにキーワードの先頭に ? マークを指定します。

greple -n 'まぐろ ?はまち ?えび' sushi.txt

image.png

だいぶ選択肢が増えました。

複数の --le オプションを使う

選択肢が増えて気が大きくなってきたので、上の条件に加えて、うにいくらも食べたくなりました。

greple -n 'まぐろ ?はまち ?えび ?うに ?いくら' sushi.txt

image.png

こうすると、はまち、えび、うに、いくら、のどれかが入っていればいいということになってしまって、期待した結果が得られません。

このような場合は --le を複数回指定します。

greple -n --le 'まぐろ ?はまち ?えび' --le '?うに ?いくら' sushi.txt

image.png

OR キーワードは、それぞれの --le オプション内でグループ化され、オプション同士は AND で評価されるため、全体としては次のような意味になります。

まぐろ AND (はまち OR えび) AND (うに OR いくら)

結果は、それぞれの検索条件毎に色分けされて、見やすく表示されています。

上の例で、最初の --le を省略することはできません。greple は、パターンオプションが指定されていない時のみ、最初の引数をパターンと解釈するので、この --le を省略すると次の引数はファイル名として扱われてしまいます。

正規表現を使う

上の例は、正規表現の | 記法を使って次のように書いても、まったく同じ意味になります。実は ? 記号がついたキーワードについては、内部的にこのような表現に変換して評価しています。

greple -n --le 'まぐろ はまち|えび' --le 'うに|いくら' sushi.txt

image.png

さらには、この例では ? を使っていないので --le オプションは1つにまとめてしまっても問題ないし、その場合は省略することもできます。

greple -n 'まぐろ はまち|えび うに|いくら' sushi.txt

image.png

慣れている人には、この方がわかりやすいかもしれません。

まとめ

--le オプションに複数キーワードを指定する際に、OR 条件を指定する方法を紹介しました。

grep を使って同じことをやろうとすれば、やはりパイプを使うことになると思います。

grep -n まぐろ sushi.txt | egrep 'はまち|えび' | egrep 'うに|いくら

image.png

このくらいになってくると、少し greple を使うメリットが感じられてくるでしょうか。条件が複雑になってくると、条件毎に色分けしてくれるのがありがたく感じられる局面も増えてきます。

SEE ALSO

https://qiita.com/advent-calendar/2021/greple

  1. https://qiita.com/kaz-utashiro/items/5b6bcbe54891b3bd9db5
  2. https://qiita.com/kaz-utashiro/items/eb8c7067e6de34842fe3
  3. https://qiita.com/kaz-utashiro/items/165e744d4250adedc4c1

Last modified April 24, 2023: update submodules (e4ab308)