4132 Stimmen

grep eine Datei, aber mehrere umliegende Zeilen anzeigen?

Ich möchte gerne grep für eine Zeichenkette, sondern zeigt auch die vorangehenden fünf Zeilen und die folgenden fünf Zeilen sowie die übereinstimmende Zeile an. Wie könnte ich dies tun?

4 Stimmen

Ich habe eine Kopie von Das Perl-Skript von Brendan Gregg zu diesem Zweck. Funktioniert gut.

7 Stimmen

Eine Lösung, die unter Solaris funktioniert, finden Sie unter dieser Link .

154 Stimmen

man grep | grep -C 1 context :)

5420voto

Pat Notz Punkte 196406

Für BSD o GNU grep können Sie -B num um festzulegen, wie viele Zeilen vor dem Spiel und -A num für die Anzahl der Zeilen nach der Übereinstimmung.

grep -B 3 -A 2 foo README.txt

Wenn Sie die gleiche Anzahl von Zeilen vor und nach der Zeile wünschen, können Sie -C num .

grep -C 3 foo README.txt

Es werden 3 Zeilen davor und 3 Zeilen danach angezeigt.

60 Stimmen

Das ist gut, aber leider unterstützt das Solaris grep das nicht. Siehe diesen Link für Solaris: unix.com/solaris/33533-grep-display-few-lines-before-after.html

9 Stimmen

Ok, aber was ist, wenn ich zeigen möchte tous Zeilen der Ausgabe nach dem Treffer? grep -A0 und grep -A-1 bringen es nicht...

0 Stimmen

Ruffp: Ich glaube, es gibt auch GNUgrep

660voto

Stu Punkte 15215

-A y -B wird funktionieren, ebenso wie -C n (für n Zeilen Kontext), oder einfach -n (für n Zeilen des Kontextes... solange n 1 bis 9 ist).

3 Stimmen

Ich habe die -n Format und fand heraus, dass es nur bis 9 . Für 15 Es werden 5 Zeilen zurückgegeben

20 Stimmen

@DeepakMahakale Das hängt wahrscheinlich damit zusammen, wie Kommandozeilenargumente/Optionen von POSIX-Programmen typischerweise geparst werden. Der Optionsspezifizierer ist ein einzelnes Zeichen (wie -A , -B o -C ). In der Regel folgt auf die Angabe der Option ein Wert ( -o a.out um die Ausgabedatei im GCC zu spezifizieren), aber es kann auch als einfacher Schalter / Flag funktionieren ( -g um Debugging-Informationen im GCC zu aktivieren). Leerzeichen zwischen Optionen sind jedoch optional, so dass es bei Optionen ohne Wert möglich ist, sie zusammenzufassen ( -ABC ), was bedeutet, dass -15 wird interpretiert -1 -5 (zwei separate Optionen) und die -5 übersteuert die -1 .

2 Stimmen

-5 ist schneller als sowohl -A 5 -B 5. Diese sind nicht dafür gedacht, zusammen verwendet zu werden. Für andere Leser des Skripts ist es sauberer, wenn Sie -A oder -B oder -C gegenüber -9 wählen.

82voto

elmarco Punkte 29466

ack arbeitet mit ähnlichen Argumenten wie grep, und akzeptiert -C . Aber es ist in der Regel besser für die Suche durch Code.

6 Stimmen

Ack unterstützt auch -A -B.

0 Stimmen

Ack ist in vielerlei Hinsicht besser als grep. Es ist schneller und hat eine einfachere Syntax.

1 Stimmen

Grep hat jedoch den Vorteil, dass es auf vielen Systemen standardmäßig installiert ist.

42voto

dbr Punkte 158949
grep astring myfile -A 5 -B 5

Damit wird "myfile" nach "astring" durchsucht, und es werden 5 Zeilen vor und nach jedem Treffer angezeigt

25 Stimmen

"grep astring myfile -C 5" bewirkt dasselbe

4 Stimmen

Wow, das ist großartig! A = nachher, B = vorher, C = Kontext

23voto

kenorb Punkte 134883

ripgrep

Wenn Sie Wert auf die Leistung legen, verwenden Sie ripgrep die eine ähnliche Syntax hat wie grep z.B.

rg -C5 "pattern" .

-C , --context NUM - Zeigen Sie die NUM-Linien vor und nach jedem Spiel an.

Außerdem gibt es Parameter wie -A / --after-context y -B / --before-context .

Das Tool basiert auf folgenden Komponenten Die Regex-Engine von Rust das macht es sehr effizient auf die großen Daten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X