grepの前後に行をフェッチしてbashを取得するにはどうすればよいですか?


151

こんにちは私はbashプログラミングに非常に慣れていません。特定のテキストを検索する方法が必要です。そのために私はgrep関数を使用します:

grep -i "my_regex"

うまくいきました。しかし、dataこのように与えられた:

This is the test data
This is the error data as follows
. . . 
. . . .
. . . . . . 
. . . . . . . . .
Error data ends

単語error(using grep -i error data)を見つけたら、その単語に続く10行を見つけたいと思いますerror。だから私の出力は:

    . . . 
    . . . .
    . . . . . . 
    . . . . . . . . .
    Error data ends

それを行う方法はありますか?


あなたの説明から、あなたはあなたが単語を進める10行が欲しいようですerror
ThomasW 2015年

回答:


266

あなたは使用することができます-Bし、-A試合前と後のラインを印刷します。

grep -i -B 10 'error' data

一致する行自体を含む、一致する前の10行を印刷します。


1
ありがとうございます。しかし、この実行をthisのような変数に格納test=$(grep -i -B 10 'error' data)echo $test、を使用して印刷しようとすると、出力として長い直線が表示されます。
スリラム

1
ありがとう、私はこのようにする必要があるのではecho "$test"なく、このようにする必要があると考えましたecho $test
スリラム

25
-C 10一度に大急ぎで前後に10行を出力します!
ジョシュアピンター

特定の以前のポイントを使用してこれを行う方法はありますか?事前に取得する必要がある長さは可変ですか?
Erudaki

31

これは、一致する行の後に10行の末尾のコンテキストを出力します

grep -i "my_regex" -A 10

行を一致させる前に先行コンテキストを10行印刷する必要がある場合は、

grep -i "my_regex" -B 10

また、先頭と末尾の出力コンテキストを10行印刷する必要がある場合。

grep -i "my_regex" -C 10

user@box:~$ cat out 
line 1
line 2
line 3
line 4
line 5 my_regex
line 6
line 7
line 8
line 9
user@box:~$

通常のgrep

user@box:~$ grep my_regex out 
line 5 my_regex
user@box:~$ 

Grepの完全一致行とその後の2行

user@box:~$ grep -A 2 my_regex out   
line 5 my_regex
line 6
line 7
user@box:~$ 

Grepの完全一致行とその前の2行

user@box:~$ grep -B 2 my_regex out  
line 3
line 4
line 5 my_regex
user@box:~$ 

Grepの完全一致行とその前後の2行

user@box:~$ grep -C 2 my_regex out  
line 3
line 4
line 5 my_regex
line 6
line 7
user@box:~$ 

リファレンス:マンページgrep

-A num
--after-context=num

    Print num lines of trailing context after matching lines.
-B num
--before-context=num

    Print num lines of leading context before matching lines.
-C num
-num
--context=num

    Print num lines of leading and trailing output context.

3
いいですね、これを数回調べなければならなかったので、おそらく-A(FTER)-B(EFORE)-C(ONTEXT)
Opentuned


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.