マッチの周囲の文字をgrep


8

巨大なデータベースダンプ内で検索と置換を行いたいと思っていますが、それは私が発生するはずの動作をしていません。ファイル内のターゲット文字列をgrepして、周囲の8文字程度を確認したいと思います(場合によっては、その数値を調整する必要があるかもしれません)。どうやってやるの?

私が目を見張ることができない理由は、何千とは言わないまでも何百ものマッチがあるからです。文字列を囲むいくつかの文字を取得し、それをuniq何かにパイプして、検索と置換で予期しない動作が発生する理由を確認します。

また、同じ行に複数のマッチがある可能性があります!


それはテキストファイルではありませんか?
enzotib 2011

それはありますが、マッチだけでもファイルが大きすぎて目が離せません。
user394 2011

回答:


12

粗雑な方法grepは次のようなものです

grep -o "....yourtext...." /path/to/the/dump.sql

ドットの数は、greppedテキストの前後の文字数に対応します。この-oオプションはgrep、行全体ではなく、一致したものだけを出力します。

uniq出力で使用するには、まず出力をソートする必要があることを覚えておいてください。だから、通常、あなたは

grep . . . | sort | uniq

各マッチのヒットカウントに興味がある場合は、次を使用して素晴らしい出力を得ることができます

grep . . . | sort | uniq -c | sort -n

原油?とても洗練されています!
user394 2011

1
repeat演算子を使用して、これを少し拡張できますgrep -o '.\{8\}yourtext.\{8\}'。これは、8ドットを数えるよりも少し目まいが少ないです。
カレブ2011

:)大雑把に言うと、一致した文字を数える(範囲を使用する)か、文字セットを狭めるようなことをしないでください。
rozcietrzewiacz 2011

@Calebとuser394:これは、私が提案しないことを意図したものです(したがって、私のメソッドを「粗雑」と呼んでいました)。また、繰り返し演算子の構成を覚えておく必要はありません。「。\ {6 \}」よりも「.....」と入力する方が高速です。
rozcietrzewiacz 2011

7

@rozcietrzewiaczの答えから始めて、

pattern="string"
num=8
grep -on ".\{0,$num\}$pattern.\{0,$num\}" input-file

1
「原油」のドットシーケンスは、常に良くなっています:)
Caleb

1
@Caleb:一般に「粗野な」答えが良い出発点ですが、時々それについて少し詳しく説明したいことがあります。
enzotib 2011

1
ドットシーケンス方式では、左揃えまたは右揃えのターゲットパターンは検出されません。このメソッドはします。(+1)
Peter.O 2011

2
PS ..最初のパターンの末尾の「exta」テキストのスコープが先頭の「extra」テキストのスコープと重複する場合、(OPで述べたように)同じ行で複数のパターンのインスタンスをキャッチしないことに気づきました次のパターンの
Peter.O

@fred:ええ、-o2つのマッチが重複する場合、最初のマッチのみを与えます:echo 'aaabbbccc' | grep -o 'bb
enzotib '25
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.