grep -A 2 -B 3
druckt 2 Zeilen nach der Grep-Zeichenfolge und 3 Zeilen vor.
grep -C 3
druckt 3 Zeilen vor und 3 Zeilen nach
Leider unterstützt das von grep
mir verwendete diese Optionen nicht. Gibt es alternative Befehle oder Skripte, um dies zu simulieren? Verwenden Sie sed
/ awk
/ perl
/ Shell-Skripte?
text-processing
grep
awk
perl
Prashant Bhate
quelle
quelle
-C
Schalter gibt.GNU > /usr/local
. Die GNU-Programme haben viele sehr nützliche Erweiterungen und sollen willkürliche Einschränkungen vermeiden (aber Sie zahlen teuer in Größe und manchmal Leistung). Viele Propietärsysteme verfügen über "inoffizielle" Paket-Repositorys mit GNU und anderen Tools. Der "Partner" wird Ihnen nichts darüber erzählen, selbst wenn sie vom Verkäufer verwaltet werden ...Antworten:
Ein mäßig hässlicher Weg, dies zu tun, ist
oder ersetzen
-c
mit-C NUM
fürNUM
Zeilen Kontext. Es wird jedoch zusätzliche Ausgabe erzeugen. (Wenn Sie /diff
unterstützen , wird es sauberer.)-u
-U NUM
Wenn Sie
diff
nicht-c
/-C
/ haben-u
, gibt es immer noch Möglichkeiten, dies zu tun, aber sie sind ziemlich hässlich. Auf der anderen Seite hat ein System,diff
das nicht einmal unterstützt,-c
wahrscheinlich auch kein Perl.quelle
grep -v pattern file | diff -c - file
ack erfordert nur Perl, und enthält
-A
,-B
und-C
Optionen , die Arbeit wie grep. Es verwendet die Regex-Syntax von Perl anstelle der von grep, und die Art und Weise, wie Dateien für die Suche ausgewählt werden, ist ganz anders. Möglicherweise möchten Sie die-f
Option ausprobieren, wenn Sie sie verwenden (wodurch die zu durchsuchenden Dateien ausgedruckt werden, ohne dass tatsächlich etwas gesucht wird).Es kann als einzelnes Skript installiert werden, für das keine Nicht-Core-Module erforderlich sind. Legen Sie es einfach in Ihrem
~/bin
Verzeichnis (oder an einer anderen Stelle in Ihrem Pfad, auf die Sie Schreibzugriff haben) ab und stellen Sie sicher, dass eschmod
ausführbar ist.quelle
ack
für Ihren eigenen Gebrauch zu installieren .Dieses einfache Perl-Skript emuliert
grep -A
bis zu einem gewissen GradBeachten Sie, dass Sie eine Verwendungsanweisung hinzufügen können, um das Skript lesbar und verwendbar zu machen;)
quelle
grep-A 3 foo
sieht viel natürlicher aus alsgrep-A foo 3
. :-)Sie können einfach GNU grep oder Ack installieren (in Perl geschrieben, versteht viele der Optionen von GNU grep und mehr).
Wenn Sie sich lieber an Standardtools und ein wenig Skripterstellung halten möchten, finden Sie hier ein awk- Skript, das das Verhalten von GNU-Greps
-A
und -Optionen emuliert-B
. Minimal getestet.Führen Sie es , wie ,
grep-ac -vpattern=PATTERN -vbefore=NBEFORE -vafter=NAFTER
woPATTERN
ist das Muster für (ein suchen erweitern regulären Ausdruck mit wenigen awk Ergänzungen ), undNBEFORE
undNAFTER
sind die Zahlen der Zeilen vor und nach einem Spiel zu drucken bzw. (säumigen auf 0). Beispiel:quelle
{ "exec" "awk" "-f" "$0" "$@"; }
: Sehr geschickter Weg, um die Einschränkungen beim Shebang-Line-Parsing zu umgehen.Es stellt sich heraus, dass es ziemlich schwierig ist, -B zu emulieren, da Probleme auftreten, wenn übereinstimmende Linien direkt aufeinander folgen. Dies verbietet die Verwendung von Single-Pass-Through-Datei-Scans.
Ich habe dies beim Herumspielen mit folgender Annäherung erkannt:
Dies funktioniert ungefähr korrekt wie grep -A7 -B3, mit der im ersten Absatz beschriebenen Einschränkung.
Eine alternative (auch Einzeldatei-) Lösung für dieses Problem besteht darin, perl eine Befehlszeichenfolge zu verwenden:
quelle
shift @A if push(@A,$_)>7;
Bit behält nur ein Array mit maximaler Größe 7 bei. (das ist dein -A-Parameter). Die zweite Option enthält eine unglaublich kleine Datei (führen Sie die Perl-Datei einfach ohne die äußere Ebene aus, um zu sehen, was dort generiert wird), liest die Datei jedoch zweimal.Mit können
sed
Sie zuerst die Zeilennummern übereinstimmender Zeilen abrufen, eine bestimmte Zeilennummer in einerwhile
Schleife dekrementieren und inkrementieren und dannsed -n "n1,n2p"
Zeilen mit führendem (n1
) und nachfolgendem (n2
) Kontext drucken (ähnlich dersed
von user455 vorgeschlagenen Alternative). Viele Lesevorgänge können jedoch zu Leistungseinbußen führen.ed
kann direkt auf die vorherigen und folgenden Zeilen einer übereinstimmenden Zeile verweisen, schlägt jedoch fehl, wenn der angegebene Zeilenbereich nicht vorhanden ist; Die übereinstimmende Zeile ist beispielsweise die Zeile 2, es sollten jedoch 5 Zeilen vor der Übereinstimmung gedruckt werden. Die Verwendunged
ist daher erforderlich, um am Anfang und am Ende eine angemessene Anzahl von (leeren) Zeilen hinzuzufügen. (Für große Dateien ist diesed
möglicherweise nicht das richtige Werkzeug, siehe: bfs - Big File Scanner ).quelle