grep 中に隣接する行を行番号付きで出力する

grep 中に隣接する行を行番号付きで出力する

ファイルの内容を grep するときに、行番号とともに隣接する行を出力する方法はありますか? 次の形式の出力を取得しようとしています:

$ ~/myscript.sh download file # 'download' being the pattern here
121: # and downloads with wget/curl, whichever is available.
122: download_file () {
123:  if which wget &>/dev/null; then
----------
356: # Since the prerequisites are already installed, we may proceed
357: download_urls=("http://example.com/foo/bar.bz2"
358:                "http://d1.example.com/xyz/abc.tar.gz"

もちろん、-nオプションを使用してパターンをgrepし、取得した行番号から隣接する行の一部を表示できることは知っています(たとえば、次のいずれかの方法を使用して)。ここ) ですが、もっと良い方法があるのでしょうか?

答え1

grepGNUのコンテキスト ライン コントロールを以下から使用できますman grep

-A NUM、--after-context=NUM
一致行の後に NUM 行の末尾のコンテキストを出力します。連続する一致グループの間にグループ区切り文字 (--) を含む行を配置します。-o または --only-matching オプションを使用すると、これは効果がなく、警告が表示されます。


-B NUM、--before-context=NUM
一致行の前に NUM 行の先頭のコンテキストを出力します。連続する一致グループの間にグループ区切り文字 (--) を含む行を配置します。-o または --only-matching オプションを使用すると、これは効果がなく、警告が表示されます。

両側に同じ数の行が必要な場合は、単一のコンテキスト番号を使用できます。

-C NUM、-NUM、--context=NUM
出力コンテキストの NUM 行を出力します。連続する一致グループの間にグループ区切り文字 (--) を含む行を配置します。-o または --only-matching オプションを使用すると、効果はなく、警告が表示されます。

-nフラグ ( )と組み合わせると--line-number、周囲のコンテキストと一致する番号が付けられます。

あなたの例では:

grep -n -C1 download

関連情報