grepコマンド 挙動の違い

コマンド

grep コマンドのオプションに、-A と -B があります。

-A num: マッチした行からの num 行を同時に検索結果として表示
-B num: マッチした行からの num 行を同時に検索結果として表示

以下のようなファイル (seasons.txt) を用意してみます。

-A と -B オプションを組み合わせてコマンドを実行してみます。
-n オプションで、行番号も表示させます。

-A オプションで指定する数値を1に変えてみます。

罫線が追加されました。
どうやら、行が連続しない場合に追加されるっぽいです。
上記はどちらも Amazon Linux 上で実行したときの結果です。

同じことを macOS のターミナル上で実行してみました。
最初に実行したコマンドから。

行が連続しているにもかかわらず、罫線が追加されました。しかも2つ。

行が連続しない場合でも罫線が2つ入ります。

-B オプションを除いてみました。

罫線が1つになりました。
どうやらオプションの数で変わるみたいです。

各環境の grep コマンドのバージョンを確認しました。

Amazon Linux

macOS

GNU 系コマンドと BSD 系コマンドは、オプションや挙動に違いがあります。
sed コマンドあたりは有名ですが、grep コマンドにもこんな罠があったとは。

Amazon Linux で実行するためのシェルスクリプトをローカルで開発、
みたいなときは、コマンドのバージョンに気をつけましょう。

というよりも、GNU core utilitiesを導入するなどして、コマンドを統一させるようにしましょう。
事故のもとです。

この記事を書いた人

小野 充輝
小野 充輝

BABYMETAL(ゆいちゃん)推しのエンジニアです

コマンド