Grep Fortschrittsbalken mit pv (Pipe Viewer)

11

Ich habe ein riesiges Verzeichnis auf meinem Computer und muss in jeder Ruby-Datei nach einer Zeichenfolge suchen.

Ich hätte es so machen können: grep -R "string" *.rbaber es dauert sehr lange und ich würde gerne pv (Pipe Viewer) verwenden, um einen Fortschrittsbalken anzuzeigen, um den grepFortschritt überwachen zu können .

Aber ich weiß nicht wirklich, wie ich diesen Befehl schreiben kann, da es noch einige Dinge gibt, die ich über diesen Befehl einfach nicht verstehen kann.

Hat jemand eine Idee?

Cydonia7
quelle

Antworten:

15

pvarbeitet mit Pipes (keine Befehle) - Dies ist eine Volumenanzeige, die anzeigt, wie viele Daten einen bestimmten Punkt in der Pipeline überschritten haben.
Ihr grep-Befehl ist keine Pipeline ( |- der pipe operatorist nirgends zu finden) - es ist nur ein einzelner Befehl, der seine Sache macht. pvIch kann Ihnen hier nicht helfen, Sie müssen nur darauf vertrauen, dass dies greptatsächlich bei allen Eingabedateien funktioniert.

Sie könnten etwas zusammen mit find, pv, xargs & grep zusammenschustern ( find . -name "*.rb" | pv | xargs grep [regex]sieht aus, als wäre es vielversprechend, aber Sie müssten sagen, pvwie groß die findAusgabe ist, damit es aussagekräftige Ergebnisse liefert.

Ehrlich gesagt scheint es mehr Arbeit zu sein, als es wert ist. Führen Sie einfach Ihren grep aus, warten Sie geduldig und bearbeiten Sie die Ausgabe, wenn sie fertig ist.

voretaq7
quelle
1
Es ist definitiv möglich , es ist nur verworren und es wird wahrscheinlich länger dauern, bis es fertig ist und funktioniert, als nur darauf zu warten, dass der
Grep
1
Könnte ein wirklich schöner Ausschnitt sein: p
Cydonia7
4

Zwei weitere Methoden:

for file in *.rb; do echo $file; grep "string" $file >> output.txt; done

Oder suchen Sie in einer anderen Shell, während Ihr ursprünglicher Befehl ausgeführt wird, die PID des Befehls grep und dann:

strace -q -s 256 -e trace=open -p [pid] 2>&1 | head

Beide oben genannten zeigen Ihnen, an welcher Datei der Befehl grep gerade arbeitet. Sie finden die Gesamtzahl der Dateien mit:

ls -l *.rb | wc -l

Verwenden Sie diese Option, um herauszufinden, welche Nummer die aktuelle Datei in der Liste enthält:

ls -l *.rb | grep -n [the current filename]

PS Meine Antworten gehen davon aus, dass sich alle Ihre Dateien in einem einzigen Verzeichnis befinden. Wenn dies nicht findder Fall ist , müssen Sie anstelle von lsund *.rbwie vorgeschlagen dünn verwenden.

Ladadadada
quelle
1
Das ist eine schöne Alternative
Cydonia7
1

Ich bin nicht sicher, welches Betriebssystem Sie verwenden, aber grep -R "string" *.extmöglicherweise funktioniert es nicht richtig für Sie.

Sie könnten besser bedient werden findin Verbindung mit grep:

find . -type f -name "*.rb" -print0 |xargs --null grep "string"

dünnes Eis
quelle
Richtig, der Befehl, den ich gegeben habe, funktioniert tatsächlich mit Fedora 16, aber Ihr Befehl ist klarer. Vielen Dank !
Cydonia7
1

In neueren Versionen von pvgibt es eine "-d"Option, um alle FDs eines anderen Prozesses zu überwachen.

Theoretisch pvfunktioniert dies also nicht nur als Pipe, sondern auch als Fortschrittsindikator für einen gesamten Prozess. (Versuchen Sie es beispielsweise mit der PID Ihres Firefox.)

Für das obige Problem ist die folgende Idee einfacher: grepVerwenden Sie lsofzusammen mit watch.

$ watch -n 1 "lsof | grep -n $PWD"

Auf diese Weise können Sie den Fortschritt Ihres Grep überwachen.

Jan Walzer
quelle
0

Hast du es schon versucht

grep -R "string" *.rb | pv

Ich weiß nicht, ob es tatsächlich funktioniert, weil es nicht weiß, wie viele Bits der Gesamtdaten durchsucht werden sollen, weil es rekursiv ist.

nhutto
quelle
4
Ich denke nicht, dass dies tun wird, was er will - es pvwird mit der Ausgabe des grep arbeiten (selbst wenn er die volle Eingabegröße spezifiziert, pvsieht die Ausgabe nur das Ende der Pipe - es wäre weit darunter -Zählen von Bytes.
voretaq7
0

Ich benutze normalerweise das proc-Dateisystem auf Linux-Systemen, dh

ls -al /proc/<pid of grep>/fd

Dies listet alle Dateien auf, die der grep-Aufruf derzeit geöffnet hat, und gibt somit einen Eindruck davon, wo er sich in der Suche gerade befindet.

Centic
quelle