it-swarm.com.de

Grep-Zeichen vor und nach dem Spiel?

Mit diesem:

grep -A1 -B1 "test_pattern" file

erzeugt eine Zeile vor und nach dem übereinstimmenden Muster in der Datei. Gibt es eine Möglichkeit, nicht Zeilen, sondern eine bestimmte Anzahl von Zeichen anzuzeigen? 

Die Zeilen in meiner Datei sind ziemlich groß, so dass ich nicht daran interessiert bin, die gesamte Zeile zu drucken, sondern nur die Übereinstimmung im Zusammenhang zu beobachten. Irgendwelche Vorschläge, wie das geht?

105
Legend

3 Zeichen vor und 4 Zeichen nach

$> 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 

Dies entspricht bis zu 5 Zeichen vor und nach Ihrem Muster. Der -o-Schalter weist grep an, nur die Übereinstimmung anzuzeigen und -E, um einen erweiterten regulären Ausdruck zu verwenden. Stellen Sie sicher, dass Sie die Anführungszeichen um Ihren Ausdruck setzen, da er sonst von der Shell interpretiert werden kann.

87
ekse

Du könntest benutzen

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

Du meinst so:

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

?

Auf beiden Seiten von test_pattern werden bis zu zwanzig Zeichen gedruckt. Die \{0,20\}-Notation ist wie *, gibt jedoch null bis zwanzig Wiederholungen anstelle von null oder mehr an. Der -o sagt nur die Übereinstimmung selbst und nicht die gesamte Zeile.

18
ruakh

Sie können regexp grep verwenden, um + second grep für die Hervorhebung zu finden

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

Mit gawk können Sie die Match-Funktion verwenden:

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

Wenn Sie mit Perl zufrieden sind, ist die Lösung flexibler: Im Folgenden werden drei Zeichen vor dem Muster gedruckt, gefolgt von einem tatsächlichen Muster und dann fünf Zeichen nach dem Muster. 

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

Dies kann auch auf Wörter und nicht nur auf Zeichen angewendet werden. Wenn Sie den folgenden Befehl eingeben, wird ein Wort vor der tatsächlich übereinstimmenden Zeichenfolge gedruckt. 

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

Folgendes wird nach dem Muster ein Wort drucken:

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

Folgendes druckt ein Wort vor dem Muster, dann das eigentliche Wort und dann ein Wort nach dem Muster:

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