
Ein Wrapper um grep, der dir hilft, nach Dingen zu suchen.
Ein Wrapper um grep, um das Tippen gängiger Muster zu vermeiden.
Ich verwende grep sehr oft. Beim Auditieren von Codebasen, beim Betrachten der Ausgabe von meg oder einfach beim Umgang mit großen Datenmengen. Dabei verwende ich häufig ziemlich komplexe Muster wie dieses hier:
▶ grep -HnrE '(\$_(POST|GET|COOKIE|REQUEST|SERVER|FILES)|php://(input|stdin))' *
Es ist wirklich leicht, beim Tippen solcher Dinge Fehler zu machen, und es kann schwer zu erkennen sein, ob du keine Ergebnisse erhalten hast, weil es keine zu finden gibt, oder weil du dich beim Schreiben des Musters vertan oder die falschen Flags gewählt hast.
Ich habe gf geschrieben, um den Pattern- und Flag-Kombinationen, die ich ständig verwende, Namen zu geben. Der obige Befehl wird also einfach zu:
▶ gf php-sources
Die Pattern-Definitionen werden in ~/.gf als kleine JSON-Dateien gespeichert, die unter Versionskontrolle gehalten werden können:
▶ cat ~/.gf/php-sources.json
{
"flags": "-HnrE",
"pattern": "(\\$_(POST|GET|COOKIE|REQUEST|SERVER|FILES)|php://(input|stdin))"
}
Um die Pattern-Länge und -Komplexität etwas zu reduzieren, kannst du auch eine Liste mehrerer Patterns angeben:
▶ cat ~/.gf/php-sources-multiple.json
{
"flags": "-HnrE",
"patterns": [
"\\$_(POST|GET|COOKIE|REQUEST|SERVER|FILES)",
"php://(input|stdin)"
]
}
Im Verzeichnis examples gibt es weitere Beispiel-Pattern-Dateien.
Du kannst das Flag -save verwenden, um Pattern-Dateien von der Kommandozeile aus zu erstellen:
▶ gf -save php-serialized -HnrE '(a:[0-9]+:{|O:[0-9]+:"|s:[0-9]+:")'
Ein Auto-Vervollständigungs-Skript ist enthalten, sodass du die Tabulatortaste drücken kannst, um dir deine Optionen anzeigen zu lassen:
▶ gf <tab>
base64 debug-pages fw php-curl php-errors php-sinks php-sources sec takeovers urls
Damit die Auto-Vervollständigung funktioniert, musst du die Datei gf-completion.bash in deiner .bashrc oder Ähnlichem sourcen:
source ~/path/to/gf-completion.bash
Damit die Auto-Vervollständigung funktioniert, musst du die Autovervollständigung (nicht nötig, wenn du oh-my-zsh hast) mit autoload -U compaudit && compinit aktivieren oder sie in .zshrc eintragen.
Danach source die Datei gf-completion.zsh in deiner .zshrc oder Ähnlichem:
source ~/path/to/gf-completion.zsh
Hinweis: Wenn du oh-my-zsh oder Ähnliches verwendest, könnte gf ein Alias für git fetch sein. Du kannst entweder das gf-Binary auf etwas anderes aliassen oder unalias gf verwenden, um den git fetch-Alias zu entfernen.
Es gibt einige großartige Code-Suchmaschinen, die einen besseren Ersatz für grep darstellen können.
Ein gutes Beispiel ist the silver searcher.
Er ist schneller (wie viel schneller) und präsentiert die Ergebnisse auf eine visuell verdaulichere Weise.
Um eine andere Engine zu nutzen, füge engine: <other tool> zur entsprechenden Pattern-Datei hinzu:
# Using the silver searcher instead of grep for the aws-keys pattern:
# 1. Adding "ag" engine
# 2. Removing the E flag which is irrelevant for ag
{
"engine": "ag",
"flags": "-Hanr",
"pattern": "([^A-Z0-9]|^)(AKIA|A3T|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{12,}"
}
E aus der Datei aws-keys.json entfernt werden, damit ag erfolgreich läuft.Wenn du Go installiert und konfiguriert hast, kannst du gf mit folgendem Befehl installieren:
▶ go get -u github.com/tomnomnom/gf
Wenn du go get verwendet hast, kannst du die Auto-Vervollständigung wie folgt in deiner .bashrc aktivieren:
▶ echo 'source $GOPATH/src/github.com/tomnomnom/gf/gf-completion.bash' >> ~/.bashrc
Beachte, dass du dein Terminal neu starten oder source ~/.bashrc ausführen musst, damit die Änderungen wirksam werden.
Um schnell loszulegen, kannst du die Beispiel-Pattern-Dateien wie folgt nach ~/.gf kopieren:
▶ cp -r $GOPATH/src/github.com/tomnomnom/gf/examples ~/.gf
Meine persönlichen Patterns, die ich als Beispiele beigefügt habe, sind für dich vielleicht nicht besonders nützlich, aber hoffentlich sind sie dennoch eine angemessene Referenz.
Ich wäre tatsächlich am meisten an neuen Pattern-Dateien interessiert! Wenn du etwas hast, nach dem du regelmäßig grepst, kannst du gerne einen PR erstellen, um neue Pattern-Dateien zum examples-Verzeichnis hinzuzufügen.
Bug-Fixes sind wie immer ebenfalls willkommen :)