web-dev-qa-db-ja.com

マッチの前後のGrep文字?

これを使用して:

grep -A1 -B1 "test_pattern" file

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

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

118
Legend

3文字前と4文字後

$> echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}'
23_string_and
grep -E -o ".{0,5}test_pattern.{0,5}" test.txt 

これは、パターンの前後で最大5文字に一致します。 -oスイッチは、grepに一致のみを表示するように指示し、-Eは拡張正規表現を使用するように指示します。式を引用符で囲んでください。そうしないと、シェルによって解釈される場合があります。

89
ekse

使用できます

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

Regexp grepを使用して検索し、2番目のgrepを強調表示に使用できます。

echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}' | grep string

23_string_and

enter image description here

0
Andrew Zhilin

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でよければ、より柔軟な解決策:以下は、パターンの前に実際のパターンが続き、パターンの後に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 if /(\w+) there/'
hey

以下は、パターンの後に1つのWordを印刷します。

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
PS.