目次

目次

grepコマンド 挙動の違い

アバター画像
小野 充輝
アバター画像
小野 充輝
最終更新日2018/03/27 投稿日2018/03/27

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

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

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

$ cat seasons.txt
Spring
Summer
Autumn
Winter
Spring
Summer
Autumn
Winter
Spring
Summer
Autumn
Winter

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

$ grep -A 2 -B 1 -n "Summer" seasons.txt
1-Spring
2:Summer
3-Autumn
4-Winter
5-Spring
6:Summer
7-Autumn
8-Winter
9-Spring
10:Summer
11-Autumn
12-Winter

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

$ grep -A 1 -B 1 -n "Summer" seasons.txt
1-Spring
2:Summer
3-Autumn
--
5-Spring
6:Summer
7-Autumn
--
9-Spring
10:Summer
11-Autumn

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

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

$ grep -A 2 -B 1 -n "Summer" seasons.txt
1-Spring
2:Summer
3-Autumn
4-Winter
--
--
5-Spring
6:Summer
7-Autumn
8-Winter
--
--
9-Spring
10:Summer
11-Autumn
12-Winter

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

$ grep -A 1 -B 1 -n "Summer" seasons.txt
1-Spring
2:Summer
3-Autumn
--
--
5-Spring
6:Summer
7-Autumn
--
--
9-Spring
10:Summer
11-Autumn

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

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

$ grep -A 1 -n "Summer" seasons.txt
2:Summer
3-Autumn
--
6:Summer
7-Autumn
--
10:Summer
11-Autumn

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

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

Amazon Linux

$ grep --version
grep (GNU grep) 2.20

macOS

$ grep --version
grep (BSD grep) 2.5.1-FreeBSD

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

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

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

アバター画像

小野 充輝

BABYMETALのゆいちゃん推しだった、悲しみに暮れているエンジニアです

目次