解説
ドットを含む文字をそのまま探す:grepの-Fと行全体の-xを比べよう
a.bを探したらaxbも見つかった。正規表現ではなく固定文字列として探す-F、行全体を比べる-x、見つからない場合の終了コードを確認する。

ログの中からa.bという文字を探したら、axbまで表示された。通常のgrepでは、検索するパターンに正規表現の意味があるからだよ。文字列をそのまま探したいときは-Fを使える。
今回はGNU grepとBashで確認する。新しい空の練習フォルダーに架空の文字だけを置き、実際のログや個人情報は使わない。検索結果を表示するだけで、元ファイルは書き換えないよ。
三つの行を用意する
printf 'a.b\naxb\nprefix a.b suffix\n' > sample.txt
grep 'a.b' sample.txt
通常の基本正規表現で、ドットは任意の一文字に一致する記号。今回のa.bはaxbにも一致するため、三つの行が表示される。
引用符で囲むだけでは、grepの正規表現の意味をなくせない。引用符は主にシェルへどう渡すかの条件であり、受け取ったgrepがどう解釈するかは別なんだ。
-Fなら固定文字列として探す
grep -F 'a.b' sample.txt
-Fを付けると、今回のドットを記号の規則ではなく文字そのものとして探す。期待する結果はa.bの行と、prefix a.b suffixの行。axbは対象外だよ。
ただし、固定文字列にしただけで、行全体が同じでなければならない条件にはならない。長い文の一部に同じ文字があっても、その行は表示される。
行全体が同じ場合だけなら-xも使う
grep -Fx 'a.b' sample.txt
-xは行全体への一致を要求する指定。今回の結果はa.bの一行だけになる。-Fと-xは、固定文字列として読むかと、一致する範囲をどこにするかという別の役割だね。
| 指定 | 今回表示される行数 |
|---|---|
| 通常のgrep | 3行 |
| grep -F | 2行 |
| grep -Fx | 1行 |
この例はASCIIの短い文字列。単語の境界や、大文字・小文字の区別、バイナリファイルなどは別の条件になるよ。
一致がないときも終了コードを見る
grep -F 'missing' sample.txt
printf 'exit=%s\n' "$?"
期待する結果は表示なし、exit=1。GNU grepでは、一致ありの0、一致なしの1、エラーの2という区別がある。エラーメッセージを無視し、何も見つからなかったから全部正常、とも判断しないようにしよう。
編集部では一時ファイルで三つの表示結果、一致なしの終了コード1、元ファイルの保持を確認した。実装による差もあるので、別環境では手元のヘルプを見よう。
シェルでの渡し方は一重・二重引用符、検索範囲の考え方はsearchとfullmatchの検証も参考になるよ。

みんなのコメント 0
感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。
最初のコメントをどうぞ。