Funktionelles Tool zum Suchen in Textdateien mit Einrückungsstruktur.
Inspiriert von Ogrep von Matt Brubeck. Dieser Oger ist kompakt und schön, aber nicht besonders auffällig.
Siehe auch ogrep – Port dieses in Python geschriebenen Tools (um ehrlich zu sein, es war das erste).
ogrep
ähnelt grep
, beide können nach Übereinstimmungen suchen und deren Kontext anzeigen. Aber der Kontext in grep
ist „N Zeilen vor/nach Übereinstimmung“, und in ogrep
ist er „Zeilen darüber stimmten mit einer mit geringerer Einrückung überein“.
Lass es mich erklären. Ich verwende dieses Tool hauptsächlich, wenn ich mit GN-Build-Dateien arbeite, daher verwende ich eine große BUILD.gn-Datei als Beispiel. Die übliche Aufgabe besteht darin, nach dem Namen der Quelldatei zu suchen und zu verstehen, welches Ziel diese Datei unter welchen Bedingungen enthält.
Suchen wir nach Erwähnungen der Datei „arena.cc“:
# grep arena.cc BUILD.gn
"base/arena.cc",
Ok, jetzt, da unsere Datei hier ist, kennen wir das Ziel nicht. Fragen wir nach etwas Kontext:
# grep -C2 arena.cc BUILD.gn
"base/address_tracker_linux.cc",
"base/address_tracker_linux.h",
"base/arena.cc",
"base/arena.h",
"base/backoff_entry.cc",
Nein, nicht so nützlich. Versuchen wir ogrep
:
ogrep arena.cc BUILD.gn
102: component("net") {
385: if (!is_nacl) {
386: sources += [
409: "base/arena.cc",
Das ist ja nützlich! Wir wissen sofort, dass die Datei im „net“-Ziel unter der Bedingung „!is_nacl“ enthalten ist.
Es ist sogar noch besser, weil ogrep
Farben verwenden kann, hier ist ein Bild:
Installieren Sie Rust und Cargo, falls Sie dies noch nicht getan haben
cargo install ogrep
Installieren Sie dann Homebrew
brew install kriomant/ogrep-rs/ogrep-rs
Tut mir leid, noch nicht, aber ich arbeite daran. Nutzen Sie vorerst Cargo.
Es stehen zahlreiche Optionen zur Verfügung. Führen Sie diese mit --help
aus, um sie aufzulisten.
Das Tool ist nicht nur für strikt einrückungsbasierte Dateien (wie Python-Quellen) oder GN-Build-Dateien nützlich, sondern auch für eine Vielzahl von Textdateien, da auch solche, die nicht auf Einrückungen basieren, in der Regel der Einfachheit halber formatiert werden.
Es sind sogar einige C-bezogene Hacks integriert.
Hier ist eine kurze Funktionsliste:
Muster ist standardmäßig ein fester Text, Sie können jedoch mit -e
einen beliebigen regulären Ausdruck verwenden.
Die üblichen Optionen -w
(ganze Wörter finden) und -i
(Suche ohne Berücksichtigung der Groß-/Kleinschreibung) sind verfügbar.
Das Tool behält einige Leerzeilen zwischen Übereinstimmungen bei, da es hilft, Gruppen verwandter Übereinstimmungen visuell zu trennen. Sie können es mit --no-breaks
deaktivieren.
Manchmal ist es nützlich zu sehen, ob zwischen den übereinstimmenden Zeilen weitere Zeilen vorhanden waren. Verwenden Sie dazu --ellipsis
.
Wenn Sie otool
in externe Tools integrieren, können die Optionen --print-filename
nützlich sein. Sie weisen an, den Dateinamen zu drucken, wenn eine Übereinstimmung gefunden wird.
Standardmäßig werden „if-else“-Zweige speziell behandelt: if-Zweige bleiben erhalten, sodass Sie die Bedingungen auch dann kennen, wenn eine Übereinstimmung im „else“-Zweig gefunden wird:
Der traditionelle Kontext (Anzeige von N führenden und/oder nachgestellten Zeilen um die passende Zeile) wird auch mit den Optionen --context/-C
, --before-context/-B
und --after-context/-A
unterstützt.
# ./ogrep filename_util_icu BUILD.gn
102: component("net") {
2106: if (!is_nacl) {
2210: if (use_platform_icu_alternatives) {
2222: } else {
2228: sources += [
2229: "base/filename_util_icu.cc",
Dies kann mit --no-smart-branches
deaktiviert werden.
--no-ignore-preprocessor
angegeben wird.Eine intelligentere Handhabung von Präprozessoranweisungen (paralleler Kontext) ist geplant.
otool
soll nur in einer einzelnen Datei suchen. Und es ist nicht so schnell, wenn man viele Dateien durchsuchen möchte. Sie können es aber auch mit anderen Suchtools wie diesem integrieren:
grep -l cache_used -r . --include='*.cc' | xargs -n1 ogrep --print-filename cache_used
git grep
Unterstützung ogrep
verfügt über eine integrierte Integration mit git grep
: Wenn die Option -g
angegeben ist, wird das zweite Argument als Pfadangabe an git grep
übergeben. Alle relevanten Optionen ( -w
, -i
usw.) werden auch automatisch an git grep
übergeben, --print-filename
wird erzwungen.
ogrep -g cache_used '*.cc'