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

これを使う:

grep -A1 -B1 "test_pattern" file

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

私のファイルの行はかなり大きいので、行全体を印刷するのではなく、むしろ文脈で一致を観察するだけです。これを行う方法に関する提案はありますか?

92

5 答え

前3文字と後4文字

$> echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}'
23_string_and
116
追加された
@Benubirdが暗示しているように、これは、マッチ対象に適度な広がりを持つ巨大なファイルには、パフォーマンス上は不可能です。
追加された 著者 matanster,
少量のデータには効果的ですが、100文字を超える文字が一致すると速度が低下します。私の巨大なXMLファイルでは、前と後の{1,200}を望んでおり、使用するには遅すぎます。
追加された 著者 Benubird,
brew install homebrew/dupes/grep でOSXをインストールし、 ggrep として実行します。
追加された 著者 kenorb,
@amit_gによるawkの方がはるかに高速です。
追加された 著者 ssobczak,
わかりにくいのは、私にとっては、これは美しい出力の特定の数の行を印刷し、次に「中止」と言います。私が探しているものに依存する行数が同じだが、遠いbash 4.1.2(1)とgrep 2.6.3、CentOS 6.5。
追加された 著者 Kev,
下記の-Eバージョンには何らかの理由でこの問題はありません。また、存在しないものを検索すると、 Aborted 行だけが取得されます。
追加された 著者 Kev,
Mac OSXでは使用できませんので、実際にはこれは広く利用できる解決策ではありません。 -Eバージョン(下記参照)は、より良い解決策です。 -Pとは何ですか? -P、--perl-regexp PATTERNをPerl正規表現(PCRE、以下を参照)として解釈します。これは非常に実験的でgrep -Pは実装されていない機能について警告することがあります。
追加された 著者 Xofo,
grep -E -o ".{0,5}test_pattern.{0,5}" test.txt 

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

79
追加された
{0,255} は、 {0,256}grep:無効な繰り返し回数を返すように、{}内に長さ2 ^ (s)
追加された 著者 CodeMonkey,

あなたは使うことができます

awk '/test_pattern/ {
    match($0, /test_pattern/); print substr($0, RSTART - 10, RLENGTH + 20);
}' file
25
追加された
誰かが複数の試合でこれを更新できますか?
追加された 著者 Pranab,
これを使って1行に複数の一致を見つけるにはどうすればいいですか?
追加された 著者 koox00,
やや大きめのファイルでもうまく動作します
追加された 著者 Touko,
中括弧内の最初の数字の意味は何ですか? "grep -E -o"の0と同じです。{0,5} test_pattern。{0,5} "test.txt"?
追加された 著者 Lew Rockwell Fan,

つまり、次のようになります。

grep -o '.\{0,20\}test_pattern.\{0,20\}' file

これは test_pattern の両側に最大20文字を出力します。 -o という表記は、 -o という記法は * に似ていますが、0〜ライン全体ではなく、マッチだけを表示します。

15
追加された
このコマンドは機能しません: grep:\ {\} の内容が無効です
追加された 著者 Alexander Pravdin,
これはOSX端末で働いていました。
追加された 著者 hapi,

gawk を使うと、マッチ関数を使うことができます:

    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 で大丈夫なら、より柔軟な解決策:以下は、パターンの前に3文字、実際のパターン、その後パターンの5文字を​​印刷します。

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 if /(\w+) there/'
hey

以下は、パターンの後に1ワードを出力します:

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

次は、パターンの前に1語、次に実際の語を、パターンの後に1語を出力します。

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