データにはしばしばブロック的な構造を持つものがあります。例えばログファイルや設定ファイルなどで、1行目に○○、2行目に××、といった形で情報がセットになって繰り返されるケースです。こういう時にオプションのない grep で検索するとマッチした1行しか出力されずデータが分かりにくいことがあります。これの対策としてあらかじめ1行に全部の情報を入れる、というのもありますが既に複数行としてフォーマットが定められているなどのケースもあります。そういった時に便利なのが grep の A, B, C オプションです。
grep --help
とすると次の内容が表示されます。
Context control: -B, --before-context=NUM print NUM lines of leading context -A, --after-context=NUM print NUM lines of trailing context -C, --context=NUM print NUM lines of output context
日本語で意訳すると次です。
コンテキスト制御: -B, --before-context=NUM マッチ行の手前をNUM行分出力 -A, --after-context=NUM マッチ行の後ろをNUM行分出力 -C, --context=NUM マッチ行の前後をNUM行分出力
そのものずばりな検索条件にマッチした行の前後行を表示するためのオプションです。これは例えば次のように使えます。
ID,Nameが行単位で繰り返されるデータがあるとします。
ID: 1001 Name: Taro ID: 1002 Name: Jiro ID: 1003 Name: Hanako
この中から Jiro を探したい場合に次のようにできます。
grep -B 1 "Jiro" data.txt
こうすれば目的のNameと手前1行――つまりIDが表示されます。
ID: 1002 Name: Jiro
こうすることで目的行を含むデータ一塊をまとめて確認できます。
データのフォーマットが固定長の場合はこんな感じできれいにできます。また、単にデータがどれくらいかざっくり目で見るだけでいいなら前後行を見るようにすればいいです。もし細かくデータ単位の開始行、終了行なども指定したいのであれば grep のみではいささか力不足です。その時は awk を使うか何かリッチなプログラミング言語を用いてコードを書くかした方がいいです。最近は昔ながらよく使われる小さいコマンドやコードならばLLMがそれなりに信用できるコマンドやコードを出力してくれるので、それをあてにするのもいいです。データを変更せず、ループなどの負荷も考えなくていい内容なら雑に試しても全然大丈夫です。