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のゆいちゃん推しだった、悲しみに暮れているエンジニアです