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のゆいちゃん推しだった、悲しみに暮れているエンジニアです
最近書いた記事
- 2018.11.15AWSマネジメントコンソールでサービスへのショートカット
- 2018.06.18DynamoDBのオートスケール化検討
- 2018.06.18DynamoDBのパーティションに気をつけよう
- 2018.04.25ghe-migratorを使用して、GitHub.comからGitHub Enterpriseへ移行してみた