2011-11-12 2 views
83

一致前後のグレープ文字は?

grep -A1 -B1 "test_pattern" file 

は、ファイル内の一致するパターンの前後に1行を生成します。行ではなく指定された文字数を表示する方法はありますか?

私のファイル内の行はかなり大きいので、行全体を印刷するのではなく、コンテキスト内でのみ一致を観察することに興味があります。これを行う方法に関する提案はありますか?

答えて

103

3文字と4つの文字を使用することができますか?

test_patternの両側に最大20文字の文字が印刷されます。 \{0,20\}の表記法は*のようですが、0以上ではなく0〜20回の繰り返しを指定します。-oは、行全体ではなく、一致自体を表示するように指示します。

+4

少量のデータには効果的ですが、100文字を超える文字が一致すると速度が低下し始めます。私の巨大なXMLファイルでは、前と後の{1,200}を望んでおり、使用するには遅すぎます。 – Benubird

+3

@amit_gによるawkの方がはるかに高速です。 – ssobczak

+1

Mac OSXでは利用できませんので、実際にはこれは広く利用できる解決策ではありません。 -Eバージョン(下記参照)は、より良い解決策です。 -Pとは何ですか? Read on ... -P、--perl-regexp PATTERNをPerl正規表現(PCRE、以下を参照)として解釈します。これは非常に実験的でgrep -Pは実装されていない機能について警告することがあります。 – Xofo

23

あなたはこのように、意味

$> echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}' 
23_string_and 
+2

:パターンの後

echo hey there how are you |perl -lne 'print $2 if /(\w+) there (\w+)/' how 

パターンの前に一つの単語が印刷されます続いて、その後、実際の単語、その後一言:

echo hey there how are you |perl -lne 'print $1 if /(\w+) there/' hey 

パターンの後に一つの単語を印刷します後幾分大きなファイルでもうまく動作します – Touko

+3

これを使って、1行に複数のマッチを見つけるにはどうすればいいですか? – koox00

+0

これを複数の試合で更新できますか? – Pranab

11

後に前

awk '/test_pattern/ { 
    match($0, /test_pattern/); print substr($0, RSTART - 10, RLENGTH + 20); 
}' file 
+0

このコマンドは動作しません: 'grep:\ {\}'の内容が無効 –

+0

これはOSX端末で動作しました。 – hapi

70
grep -E -o ".{0,5}test_pattern.{0,5}" test.txt 

パターンの前後に5文字まで一致します。 -oスイッチはgrepにマッチを示すように指示し、-Eは拡張正規表現を使用するように指示します。あなたの式の周りに引用符を入れてください。そうでなければ、それはシェルによって解釈されるかもしれません。 gawk

0

、あなたはmatch関数を使用することができます。

x="hey there how are you" 
    echo "$x" |awk --re-interval '{match($0,/(.{4})how(.{4})/,a);print a[1],a[2]}' 
    ere are 

あなたはperlでOKであれば、より柔軟な解決策:パターンは、実際のパターンとパターンの後に、その後5文字が続く前に、次の3つの文字を印刷します。

echo hey there how are you |perl -lne 'print "$1$2$3" if /(.{3})(there)(.{5})/' 
ey there how 

これは、文字だけでなく単語にも適用できます。実際に一致する文字列の前に1語が印刷されます。

echo hey there how are you |perl -lne 'print "$1$2$3" if /(\w+)(there)(\w+)/' 
hey there how