JARs nach String durchsuchen (Linux)

Ich habe kürzlich darüber nachgedacht, ein Groovy-Skript zu schreiben, um JARs nach einer bestimmten Zeichenfolge zu durchsuchen, aber ich habe mich entschlossen, zuerst nach einer Alternative zu suchen, anstatt ein Skript zu schreiben. Die Alternative musste einfach zu bedienen, frei verfügbar und nicht mit einer Vielzahl von Abhängigkeiten verbunden sein. Ich war froh, dass ich zuerst nachgesehen habe, denn der Linux-basierte Ansatz von "jan61" hat meine Bedürfnisse gut befriedigt. In diesem Blog-Beitrag schaue ich mir dieses Beispiel genauer an.

Wie im LinuxQuestions.org-Thread dokumentiert, der den Inhalt der .class-Datei in jar (nach Zeichenfolgen) durchsucht, erledigt ein einzeiliger Befehl unter Linux die Aufgabe, JARs rekursiv aus einem bestimmten Verzeichnis nach einer bestimmten Zeichenfolge zu durchsuchen. Diese Suche sucht nicht nach den Namen der Einträge selbst in der JAR, sondern nach dem Inhalt jeder durchsuchbaren Datei in der JAR. Hier ist diese einfache Zeile (das Token repräsentiert die Zeichenfolge, nach der gesucht werden soll):

Linux-Befehl zum Durchsuchen des Inhalts von JAR-Dateien nach bestimmten Zeichenfolgen

find . -iname '*.jar' -printf "unzip -c %p | grep -q '' && echo %p\n" | sh 

Ich möchte dies in Skriptform (oder als Alias) haben, da dieser Name leichter zu merken ist, als jedes Mal den gesamten Befehl einzugeben. Hier ist ein Beispielskript, das verwendet werden könnte.

Linux-Skriptform des obigen Befehls

printf "Searching JARs for string '${1}'...\n" find . -iname '*.jar' -printf "unzip -c %p | grep -q '${1}' && echo %p\n" | sh 

Die beiden unmittelbar oben gezeigten Versionen des Befehls funktionieren unverändert, und der Rest dieses Blogposts konzentriert sich auf die Funktionsweise des Befehls. Ich beginne den Befehl von innen zu analysieren und gehe nach außen.

Der Linux-Entpackungsbefehl "Liste [s], teste [s] und extrahiere [s] komprimierte Dateien in einem ZIP-Archiv." Der -can den Entpackungsbefehl übergebene Befehl "[s] files to stdout extrahieren" und enthält den Namen der extrahierten Dateien mit dieser Standardausgabe. Das %pist dem Linux-Befehl find zugeordnet. Insbesondere %phandelt es sich um eine Anweisung an das -printfFlag des findBefehls, das ihn anweist, den Namen der gefundenen Datei einzuschließen.

Jede gefundene Datei wird entpackt und ihr Inhalt an die Standardausgabe weitergeleitet, wo sie an einen grep-Befehl weitergeleitet wird, um nach der bereitgestellten Textzeichenfolge zu suchen. Der -qangegebene Parameter gibt den "leisen" Modus an, in dem nichts in die Standardausgabe geschrieben wird und der grepsofort mit dem Statuscode Null beendet wird, wenn eine Übereinstimmung festgestellt wird. Die Symbole && geben an, dass der Befehl echo ausgeführt wird, um den Dateinamen mit Inhalten auszudrucken, die mit dem grep-ed für String übereinstimmen, wenn (und nur wenn) der Befehl grep einen erfolgreichen Status (0) zurückgibt.

Alle oben genannten .jarSchritte werden dank des find . -iname '*.jar'Befehls nur für Dateien mit Erweiterung ausgeführt . Das Ganze wird zu einer Muschel geleitet.

Dank jan61 für den eleganten Linux-Befehl, der in diesem Beitrag behandelt wird und das Durchsuchen des Inhalts von Dateien in JARs nach einer bestimmten Zeichenfolge erleichtert.

Originalbeitrag verfügbar unter //marxsoftware.blogspot.com/ (Inspiriert von tatsächlichen Ereignissen)

Diese Geschichte "Searching JARs for String (Linux)" wurde ursprünglich von JavaWorld veröffentlicht.