grep etwas mit xargs und find
bash-guru 😉 ich versuche es zu verbessern, einige Zeichenfolge in die bash grep keyword - übereinstimmungen in bestimmten Dateien. Es sieht so aus:
find /<path>/hp -iname '*.ppd' -print0 | xargs -0 grep "\*ModelName\:"
das funktioniert sehr schnell für mich! In 20-mal schneller ist als diese:
find /<path>/hp -iname '*.ppd' -print0 | xargs -0 -I {} bash -c 'grep "\*ModelName\:" {}'
Aber das problem ist, dass im ersten Skript, das ich bin immer folgende Zeilen:
/<path>/hp/hp-laserjet_m9040_mfp-ps.ppd:*ModelName: "HP LaserJet M9040 M9050 MFP"
aber das gewünschte Ergebnis ist einfach
*ModelName: "HP LaserJet M9040 M9050 MFP"
(wie in dem zweiten Skript). Wie kann ich es erreichen?
P. S.: ich bin mit find
für Flexibilität und zukünftige Verbesserungen des Skripts.
Ich verstehe nicht, warum man einen eingreifenden
Auch ohne Aufruf eingreifenden bash explizit, es wird funktionieren auf die gleiche langsame: find /<path>/hp -iname '*.ppd' -print0 | xargs -0 -I {} grep "*ModelName\:" {}.
bash
in Ihrem zweiten Befehl.Auch ohne Aufruf eingreifenden bash explizit, es wird funktionieren auf die gleiche langsame: find /<path>/hp -iname '*.ppd' -print0 | xargs -0 -I {} grep "*ModelName\:" {}.
InformationsquelleAutor likern | 2012-12-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
-h
optiongrep
unterdrücken Dateinamen aus der Ausgabe.Wenn Ihr
grep
nicht-h
die Verwendungcat
:Auch für Ihre Informationen
find
bietet die-exec
option zu machen, müsstexargs
unnötige hatten, die Sie verfolgen wollte, die zweite option:er Sprach über die Geschwindigkeit auch. die -exec wird es langsamer, aber es funktioniert, lösen Sie den Dateinamen Problem
Das mit dem Namen Fragen sollten, wenn ich
find ... -print0 | xargs -0
? Die Problemefind -exec
löst, die nichtfind ... -print0 | xargs -0
? Vielleicht wird mein code ist fehleranfällig?Und ja, meine erste Beispiel verwendet wurde
find -exec
wurde dramatisch langsamer... es dauerte 23 Sekunden, vs 0,3 Sekunden jetzt. Deshalb habe ich mich entschieden Sie neu zu schreiben.InformationsquelleAutor kmkaplan
Keine Notwendigkeit für
find
:InformationsquelleAutor Chris Seymour
Können Sie loszuwerden, finden insgesamt (in der bash):
Könnte etwas langsamer sein, wenn Sie eine riesige directory-Baum (was ich bezweifle in deinem Fall).
In diesem Fall, würden Sie besser verwenden:
(beachten Sie die
+
am Ende: nur eingrep
gestartet werden).InformationsquelleAutor gniourf_gniourf
Denken Sie an Ihre line-Ausgang
als einen Datensatz mit drei Feldern, getrennt durch einen Doppelpunkt. Wenn Sie denken, dass der output-Zeile diese Weise, dann, das Sie extrahieren möchten das Dritte Feld, wie die endgültige Antwort. Wenn Sie nicht wissen, etwas über awk, sollten Sie wissen zumindest, wie man zum drucken einer Spalte der Ausgabe von Daten mit einer bestimmten Spalte Trennzeichen, wie ich bin, zeigt Sie unter:
Die andere Sache, die Sie wissen sollten über awk ist, wie die Summe (und gelegentlich den Durchschnitt) der zahlen in einer bestimmten Spalte der output-Daten, aber das ist eine andere Geschichte für einen anderen Tag 🙂
Den Vorteil anfügen, die awk Befehl in die Kommando-Kette ist, dass Sie mit dem Gebäude auf und nutzen Sie die schnelle Leistung Ihres optimierten Kommando-Kette 🙂
In Ihrem Fall, die Antwort ist grep mit xargs und finden und awk 🙂
InformationsquelleAutor Vietnhi Phuvan