🎃

Macでggrepを使おう

2024/09/04に公開

概要

  • MacとLinuxのGrepはバイナリが違うためオプションが異なる。ネット記事にはLinuxのGNU版Grepの記事が多いためMac内のGrepではエラーになることがある
  • Brew使ってGNU版Grepを落としてきてggrepコマンドとして使う方法がある
  • 個人で使う範囲ならggrepにしたほうが楽

brewのggrepはここ
https://formulae.brew.sh/formula/grep

(参考)https://stackoverflow.com/questions/16658333/grep-p-no-longer-works-how-can-i-rewrite-my-searches

Grepで正規表現を使いたい場合はPオプションが引っかかるがMacのBSD版Grepにはオプションが存在しないためエラーになる。

# grepコマンドを使うもエラーになる
$ grep -o -P '(?<=<st:italic>).*(?=</italic>)' file.txt

grep: invalid option -- P

なので以下のようにgrepの代わりにggrepにしよう

$ brew install grep

# ログからエラーを探すサンプル
$ ggrep -P "^ERROR" log.txt

(参考)それ以外にBSDとGNUで挙動違うコマンドあるのか?

LMMに聞いてみたところ結構違うところがあるらしい。BSD版は最低限のかるい挙動基準っぽい。

1. grep

  • BSD版: 標準的なオプションのみを提供。色付け (--color) や拡張オプション (--exclude, --include) はありません。
  • GNU版: --color でマッチ部分を色付けしたり、--exclude, --include で特定のファイルを除外・含めたりできます。

2. sed

  • BSD版: 一部の拡張オプション (-r や -E の正規表現拡張) が使用できない。また、インプレース編集の挙動が若干異なります。
  • GNU版: -r で拡張正規表現を使えるなどの追加機能があります。

3. find

  • BSD版: 一部のオプションが使えない。例えば、-delete オプションがない場合があります。
  • GNU版: -delete オプションがあります。-print0 や -exec も柔軟に使えます。

4. tar

  • BSD版: 個別の --strip-components オプションなどがない場合がある。
  • GNU版: --exclude や --strip-components といった多くの便利なオプションがあります。

5. du

  • BSD版: デフォルトではブロックサイズが異なる。オプションが少ない。
  • GNU版: -hや--max-depthなどの使いやすいオプションがあります。

6. sort

  • BSD版: 一部のオプションが異なる、または存在しない。-h (ヒューマンリーダブル) オプションがない。
  • GNU版: -h や -V (ソートアルゴリズム切り替え) などの多くのオプションが使えます。

7. ps

  • BSD版: オプションが異なる場合が多い。例えば、aux オプションの使い方が異なる。
  • GNU版: より多くのフィルタリングオプションや表示フォーマット設定が可能。

Discussion