ファイルをgrepしますが、周囲のいくつかの行を表示しますか?


3419

grep文字列にしたいが、前の5行と次の5行、および一致した行も表示します。どうすればこれを実行できますか?


3
私はこの目的のためにBrendan Greggのperlスクリプトのコピーを保管しています。うまくいきます。
イーサンポスト

6
Solarisで機能する解決策については、このリンクを確認してください
jahroy 2013年

107
man grep | grep -C 1 context:)
StvnW 2015年

20
man grep | grep -C 1 "\-C";)
アンデルスB

9
@StvnW ...そのメタを(SOコンテキストではなく、より一般的に)呼び出すか、何と呼ぶかわかりません。答えを使用して答えを見つける方法を示すことにより、質問に答えました。
bballdave025 2018

回答:


4538

BSDGNU grepを使用でき-B num試合前に、どのように多くの行を設定するために-A num試合後の行数のため。

grep -B 3 -A 2 foo README.txt

を使用する前と後で同じ行数が必要な場合-C num

grep -C 3 foo README.txt

これは、前の3行と後の3行を示します。


56
良いことですが、残念ながらSolaris grepはそれをサポートしていません。:Solaris用リンクしているページを参照してくださいunix.com/solaris/33533-grep-display-few-lines-before-after.html
рüффп

9
では、一致後に出力のすべての行を表示たい場合はどうでしょうか。grep -A0およびgrep -A-1はそれをカットしません...
g33kz0r

2
私のマニュアルページに記載されていますが、何らかの理由で私にはうまくいきません。
HayriUğurKoltuk 2012

2
HP-UX envの場合、どのgrepバージョンもSolarisのように機能しません。Solarisリンクを使用できましたが、そのリンクでnawkをawkに置き換えました。
zkarthik 2013年

6
-nは行番号用ですが、grepの一部のバージョンでは-n#は(-cなどの)周囲の行を行番号付きで表示します。これは、コンテキストが必要なときに頼りになる便利なショートカットです。
Anthony DiSanti 2013年

607

-Aそして-B-C nnコンテキストの行の場合は)そのまま、または-nnコンテキストの行の場合は... nが1〜9である限り)機能します。


私はこの-nフォーマットを試してみましたが、それが機能するのはまでしかわかりません9155行を返すため
Deepak Mahakale

7
@DeepakMahakaleこれはおそらく、コマンドライン引数/オプションがPOSIXプログラムによって通常どのように解析されるかに関連しています。オプション指定子は(のような単一の文字である-A-Bまたは-C)。通常、オプション指定子の後に値が続きます(-o a.outGCCで出力ファイルを指定するため)が、単純なスイッチ/フラグとして機能することもできます(-gGCCでデバッグ情報を有効にするため)。ただし、オプション間のスペースはオプションであるため、値のないオプションについては、それらをマージ(-ABC)することができます。つまり、-15解釈され-1 -5(2つの別々のオプション)、-5オーバーライドがをオーバーライドします-1
natiiix

1
-5は、両方よりも高速です。-9よりも-Aまたは-Bまたは-Cを選択すると、スクリプトの他の読者にとってはわかりやすくなります。
Eric Aldinger

76

ackはgrepと同様の引数で機能し、を受け入れます-C。しかし、通常はコードを検索するのに適しています。


5
ackは-A -Bもサポートしています。
Shuo

Ackは多くの点でgrepより優れています。構文が単純なため、処理速度は速くなります。
2017

1
grepには、多くのシステムにデフォルトでインストールされるという利点があります。
Marc Z

1
@MarcZ:はい、grepはackよりもデフォルトでインストールされる可能性が高くなりますが、ackは移植可能なスタンドアロンスクリプトです。コンパイルしたり、/ usr / bin /などのシステムディレクトリにインストールしたりする必要はありません。ダウンロードして、$ PATH(およびそのeXecute許可ビットセット)にリストされているディレクトリに配置すると、すぐに機能するはずです。(ackを機能させるためにsudoまたはroot特権は必要ありません。)
JL

この質問はについてですがgrep、「宣伝」するためにそれを使用することackは確かです(これは本当に素晴らしいツールです)は良い考えです…
MonsieurDart

39
grep astring myfile -A 5 -B 5

それは「astring」の「myfile」をgrepし、各一致の前後に5行を表示します


19
"grep astring myfile -C 5"でも同じようになります
Syed Siraj Uddin

20

私は通常使用します

grep searchstring file -C n # n for number of lines of context up and down

grepのようなツールの多くにも、非常に優れたmanファイルがあります。自分でできることはたくさんあるので、grepのmanページをよく参照しています。

man grep

多くのGNUツールには、manページに加えて、より有用な情報を含むかもしれないinfoページもあります。

info grep

13

grepを使用する

$ grep --help | grep -i context
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
  -NUM                      same as --context=NUM

受け入れられた回答を読みませんでしたか?あなたは、ほぼ10歳の質問ですでに述べられていることを繰り返すだけです
妖怪

7
ああ、ごめんなさい、妖怪。しかし、私は答えを取得するためにgrepのヘルプセクションをgrepすることについて何も読みません。
Chiel ten Brinke、2018年

1
@Yokai Chiel ten Brinkeが言ったことに加えて、受け入れられた答えは長いオプションについて言及していません
user3738870

10

「/some/file.txt」で「17655」を検索して、前後に10行のコンテキストを表示し(Awkを使用)、出力の前に行番号とコロンを付けます。「grep」が「-[ACB]」オプションをサポートしていない場合、Solarisでこれを使用します。

awk '

/17655/ {
        for (i = (b + 1) % 10; i != b; i = (i + 1) % 10) {
                print before[i]
        }
        print (NR ":" ($0))
        a = 10
}

a-- > 0 {
        print (NR ":" ($0))
}

{
        before[b] = (NR ":" ($0))
        b = (b + 1) % 10
}' /some/file.txt;

7

ripgrep

パフォーマンスを気にする場合は、ripgrep構文をgrepに似たものを使用してください。

rg -C5 "pattern" .

-C--context NUM-各一致の前後にNUM行を表示します。

-A/ --after-context-B/ などのパラメーターもあります--before-context

このツールは、Rustの正規表現エンジンの上に構築されているため、大規模なデータに対して非常に効率的です。


5

これが@Ygorソリューションですawk

awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=3 a=3 s="pattern" myfile

注:変数ab変数を前後の行数で置き換えます。

これは-A、grep -B-Cパラメータをサポートしていないシステムで特に役立ちます。


4
$ grep thestring thefile -5

-5あなたが取得する5行試合上方および下方に「thestring」に相当します-C 5-A 5 -B 5


4

Grepにはと呼ばれるオプションContext Line Controlがあり--context、その中で簡単に使用できます。

| grep -C 5

または

| grep -5

トリックを行う必要があります


1

私はコンパクトな方法を行うために使用します

grep -5 string file

それは同等です

grep -A 5 -B 5 string file

0

コードを頻繁に検索する場合、銀の銀のサーチャーであるAGは、grepよりもはるかに効率的です(つまり高速です)。

-Cオプションを使用してコンテキスト行を表示します。

例えば:

ag -C 3 "foo" myFile

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