grepを実行し、一致の前後にx行数を表示する方法

grepを実行し、一致の前後にx行数を表示する方法

grep正規表現に一致する行だけが返されます。通常、私が実際に見たいのは、一致する行の上下の数行です(例:2行)。これを達成する簡単な方法はありますか?

編集者:オペレーティングシステム:UbuntuベースのBodhi Linux。コメントで述べたように、-Cは通常のバージョンでは動作しませんが、私の場合はGNU grepでした。

答え1

から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 オプションを使用すると効果がなく、警告が表示されます。

それがどれくらい簡単なのか見てください。 manあなたの友達です。

答え2

使用(携帯用):

awk '
    {
        arr[NR]=$0
    }
    END{
        for (i=0;i<=NR;i++) {
            if (arr[i] ~ grep){
                for (j=i-count; j<=i+count; j++) {
                    print arr[j]
                }
            }
        }
    }
' grep=kdm count=4 /etc/passwd

ゲーム前/後に4行でユーザーをkdm把握します。/etc/passwd

スクリプト:

#!/bin/sh

awk '
    {
        arr[NR]=$0
    }
    END{
        for (i=0;i<=NR;i++) {
            if (arr[i] ~ grep){
                for (j=i-count; j<=i+count; j++) {
                    print arr[j]
                }
            }
        }
    }
' grep="$1" count="$2" "$3"

使用法:

./contextgrep <pattern> <count> <file> 

関連情報