🗂

grep の -A オプションが便利

に公開

grep 系のツールを使うときに -A オプションを知っていると便利なのだが、私自身 -A オプションを知って活用できたのは grep を知ってからかなり時間が経ってからだったため、ここで紹介しておきたい。

grep の -A オプションとは

以下の文は、私の手元の macOS で man grep を実行した際に表示される -A オプションの説明である。

-A num, --after-context=num
        Print num lines of trailing context after each match.  See also the -B and -C options.

つまり、grep の引数として指定した検索文字列にマッチした行から、-A オプションで指定した num 行分を加えて出力する、ということだ。

grep の -A オプションを使った場合の出力

以下の内容が記述されている users.yml があるとする。

/api/users:
  get:
    summary: 利用者の一覧を返す
    description: 利用者の情報を配列で返す。
    responses:
      "200":
        description: User schema の一覧を返す
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/User"
      "403":
        description: Forbidden
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Error"
      "500":
        description: Internal Server Error
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Error"

grep '"403"' -A 5 users.yml を実行すると、以下のようにマッチした "403" の後に 5 行分だけ内容が出力される。

$ grep '"403"' -A 5 users.yml
    "403":
      description: Forbidden
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/User"

grep の -A オプションを使った事例

先ほど例示した users.yml のような swagger の API 定義がある target ディレクトリのYAMLにある "403" のレスポンスが、すべて同じ schema で一致しているかどうかを調べたいというものだった。

"403" の件数をあらかじめ調べておき、"403" の後ろ 5 行も出力し、そこに components/schemas/Error が何件あるかを調べることで、件数が一致するかどうかを確かめた。

$ grep '"403"' -R ./target | w -l
10

$ grep '"403"' -R ./target -A 5 | grep 'components/schemas/Error' | wc -l
10

件数が異なる場合は、正規表現等で異なるものを絞り込んで修正した。

$ grep '"403"' -R ./target | w -l
10

$ grep '"403"' -R ./target -A 5 | grep 'components/schemas/Error' | wc -l
9

$ grep '"403"' -R ./target -A 5 | grep -E 'components/schemas/.+Error'
target/test.yml             $ref: "#/components/schemas/ForbiddenError"

最近では、AI に依頼してコマンドを提案してもらったり、問題が見つかった際に対応する修正も併せて依頼することも多い。
ただし、AI も間違えることはあるため、あらかじめ検証できる手段を知っていると安心して作業を依頼できるため、知っておく価値はあると考えている。

grep 以外でも使える -A オプション

今回は grep コマンドの -A オプションを挙げて説明したが、git-grep、ripgrep(rg)、the_silver_searcher(ag)、the_platinum_searcher(pt) にも同様の -A オプションがあるので、お好みの検索コマンドでも利用できるだろう。

ショート版のオプションは -A であるが、ロング版のオプションは各コマンドで微妙に異なるので注意すること。
grep/git-grep/ripgrep は --after-context、the_silver_searcher/the_platinum_searcher は --after であった。

ちなみに、-A が after であるのに対し、-B は before で検索文字列にマッチした行の前を指定行数分だけ出力できるようになっている。
こちらも grep/git-grep/ripgrep は --before-context、the_silver_searcher/the_platinum_searcher は --before であった。

更に、前後 num 行出力する -C オプションもあるので、一度手元の検索コマンドの man を確認することをオススメする。

まとめ

git-grep、ripgrep(rg)、the_silver_searcher(ag)、the_platinum_searcher(pt) で使える、 -A オプションについて説明した。

検索文字列にマッチした行から、-A オプションで指定した num 行分を加えて出力する。

他にも -B-C があるので、使用している検索コマンドの man を確認することをオススメする。

参考

https://www.gnu.org/software/grep/manual/grep.html
https://git-scm.com/docs/git-grep
https://github.com/BurntSushi/ripgrep
https://github.com/ggreer/the_silver_searcher
https://github.com/monochromegane/the_platinum_searcher

あしたのチーム Tech Blog

Discussion