【Linux】複数行のブロック的なデータをgrepでいい感じに表示する

  • 2025年9月4日
  • bash

 データにはしばしばブロック的な構造を持つものがあります。例えばログファイルや設定ファイルなどで、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がそれなりに信用できるコマンドやコードを出力してくれるので、それをあてにするのもいいです。データを変更せず、ループなどの負荷も考えなくていい内容なら雑に試しても全然大丈夫です。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG