🎃
Macでggrepを使おう
概要
- MacとLinuxのGrepはバイナリが違うためオプションが異なる。ネット記事にはLinuxのGNU版Grepの記事が多いためMac内のGrepではエラーになることがある
- Brew使ってGNU版Grepを落としてきてggrepコマンドとして使う方法がある
- 個人で使う範囲ならggrepにしたほうが楽
brewのggrepはここ
(参考)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