DESIGN / CODE / INFRA / AI

解説

ドットを含む文字をそのまま探す:grepの-Fと行全体の-xを比べよう

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

ドットを含む文字をそのまま探す:grepの-Fと行全体の-xを比べよう
保存リストを見る →
この記事の道しるべ 4項目

ログの中から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

感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。

最初のコメントをどうぞ。