grep
Befehlsoptionen
Ich wollte mein gesamtes Laufwerk nach einer Zeichenfolge durchsuchen. Nach der akzeptierten Antwort in Stack Overflow habe ich verwendet:
sudo time grep -rnw '/' -e 'Sony 50"'
Die Verarbeitung von 20 GB Daten auf einer der schnellsten PCIe NVMe M.2-SSDs dauerte 53 Stunden . Samsung Pro 960.
grep
Ausgabeprotokoll
Wenn grep
einige Dateien verarbeitet werden, werden Fehlermeldungen generiert. Diese können durch Anhängen 2>/dev/null
an den Befehl unterdrückt werden . Die Fehler geben jedoch Rückmeldung über die erzielten Fortschritte. Einige der Beispielausgaben (es passt nicht alles) sind unten aufgeführt:
Binary file /home/Me/.config/google-chrome/Default/Sync Data/SyncData.sqlite3 matches
grep: /sys/kernel/security/ima/policy: Permission denied
grep: /sys/kernel/slab/:dt-0000008/alloc_calls: Function not implemented
grep: /sys/kernel/slab/:dt-0000008/free_calls: Function not implemented
(... SNIP ... 12 hours later PID 882 processed below...)
grep: /proc/882/task/922/attr/sockcreate: Invalid argument
grep: /proc/882/task/923/mem: Input/output error
(... SNIP ... 24 hours later PID 2954 below...)
grep: /proc/2598/attr/sockcreate: Invalid argument
grep: /proc/2954/task/2954/mem: Input/output error
(... SNIP ... 42 hours later PID 4396 below...)
grep: /proc/4389/attr/sockcreate: Invalid argument
grep: /proc/4396/task/4396/mem: Input/output error
(... SNIP ... After 53 hours `grep` finally finishes...)
grep: /run/user/1000/gvfs: Permission denied
Command exited with non-zero status 2
97355.34user 83223.12system 53:07:40elapsed 94%CPU (0avgtext+0avgdata 31116maxresident)k
593910020inputs+0outputs (1major+10731minor)pagefaults 0swaps
grep
macht den Eindruck, es ist gefroren
Manchmal dachte ich, ich grep
sei eingefroren, weil der Bildschirm eine Stunde lang nicht aktualisiert wurde und die Festplattenanzeige nicht viel blinkte. Conky sagt mir jedoch, dass es immer noch läuft und 100% CPU auf einem einzelnen Kern benötigt, wie in diesem GIF gezeigt .
Von den 19,5 GiB von 43,8 GiB, die auf der Linux-Partition (Ubuntu 16.04.3 LTS) verwendet werden, wird die Hälfte dieses Speicherplatzes, 10 GB , von Kerneln verwendet. Das Herunterladen und Testen von Kerneln ist meine Freizeit.
Dieser Test dauerte den größten Teil meines Wochenendes plus Montag.
Wie kann ich beschleunigen grep
und trotzdem das bekommen, wonach ich suche?
quelle
grep
jede einzelne Datei auf dem Computer verwenden würden ? Ich finde einen Benutzerfall, in dem eigentlich nichts über den Pfad oder Namen der Datei bekannt ist, sehr schwer vorstellbar - wenn dies der Fall ist, sollte diefind
Ausgabe von Pipinggrep
mitparallel
(oder die langsamere Alternativexargs
) der richtige Weg sein.xrandr
der Liste" DP-1 "enthalten. Ich wollte die Datei finden, in der der vollständige Monitorname in der Gnome-Desktop-Engine gespeichert ist, auf die zugegriffen wurde hatte ohne Glück ausgiebig nach dem Dateinamen/usr
ist ein perfekter Ausgangspunkt./usr
. In meinem Fall/usr/src
verlangsamt es sich, aber ich kann noch nicht herausfinden, wie ich das mit grep überspringen kann. Wie bei den anderen Komplikationen bei der/
Handhabung. Ich muss mehr testen.Antworten:
Virtuelle Dateisysteme ausschließen
Wenn wir uns das Beispielausgabeprotokoll ansehen, sehen wir, dass virtuelle Dateisysteme in die Suche einbezogen werden, was eine unnötige Zeitverschwendung darstellt. Löschen Sie diese und andere Verzeichnisse mit der
--exclude-dir
Option aus der Suche . Zum Beispiel:Wenn
grep
die/proc
Verzeichniskette analysiert wird, werden alle Prozess-IDs nutzlos angezeigt, was in meinem Fall mehr als einen Tag dauert.Auch bei der Verarbeitung
/mnt
werden unnötigerweise gemountete Windows NTFS-Laufwerke und USBs betrachtet./media
Hier befinden sich das CD / DVD-Laufwerk und externe USB-Laufwerke.Ausgabe:
Los geht's 56 Sekunden statt 50 Stunden !
Hinweis: Wenn Sie
usr
(in meinem Fall 6,5 GB Dateien) von der Suche ausschließen, sind es nur 8 Sekunden:Interessante Notizen
Das Heraushalten der Systemverzeichnisse scheint
grep
besser zu bleiben und trifft niemals 100% der CPU auf einem einzelnen Kern. Außerdem blinkt die Festplattenanzeige ständig, damit Sie wissen, dass siegrep
wirklich funktioniert und nicht "im Kreis denkt".Wenn Sie nicht das Präfix
tmp
mit/
dann wird es jedes Unterverzeichnis enthält , ignorierttmp
zum Beispiel/home/Me/tmp
. Wenn Sie --exclude-dir verwenden,/tmp
wird Ihr Verzeichnis/home/Me/tmp
durchsucht.Wenn auf der anderen Seite Sie Präfix
sys
mit/
dann dann/sys
Verzeichnis wird durchsucht und Fehler gemeldet. Gleiches gilt für/proc
. Sie müssen sie also verwendensys,proc
und nicht voranstellen/
. Gleiches gilt für andere Systemverzeichnisse, die ich getestet habe.Alias erstellen
grepall
Richten Sie einen Alias ein,
~/.bashrc
damit Sie die--exclude-dir
Parameterliste nicht jedes Mal eingeben müssen:Detaillierte Zeitaufschlüsselung
In diesem Abschnitt wird beschrieben, wie viel Zeit gespart wird, indem der
--exclude-dir
Parameterliste schrittweise Verzeichnisse hinzugefügt werden:/proc
und 52 Stunden/sys
sparen/media
3 Minuten sparen/mnt
21 Minuten sparen/usr/src
(durch Angabesrc
) 53 Sekunden sparen/lib/modules
(durch Angabemodules
) 39 Sekunden sparenAusschluss
/proc
und/sys
VerzeichnisseDie Verzeichnisse
/proc
und/sys
sind am zeitaufwändigsten und am nutzlosesten, um die meisten Fehler zu suchen und zu generieren. Es ist "nutzlos", da diese beiden Verzeichnisse zur Laufzeit dynamisch erstellt werden und keine permanenten Dateien enthalten, die Sie möchtengrep
.Eine große Zeitersparnis wird erzielt, indem sie ausgeschlossen werden:
Nur 27 Minuten, diesmal über 52 Stunden !
Es gibt jedoch immer noch Fehler. In einem
/var
Verzeichnis, das auch ein zur Laufzeit erstelltes "virtuelles Verzeichnis" ist. Das/run
Verzeichnis, das ein Android-Handy enthält, und das/media
Verzeichnis, das eine alte kaputte Laptop-Festplatte enthält, die jetzt an ein externes USB-Festplattengehäuse angeschlossen ist.Hinzufügen
/media
, um die Liste auszuschließenDas
/media
Verzeichnis enthält ein altes Laptop-Laufwerk, das über einen USB 3.0-Anschluss angeschlossen ist. Smartctl meldet täglich Fehler auf dem Laufwerk und verfügt nicht über die gesuchten Dateien. Wir werden es ausschließen, um Zeit zu sparen und Fehlermeldungen zu reduzieren:Mit Ausnahme der fehlerhaften Festplatte, die über ein USB 3.0-Gehäuse angeschlossen ist, wurden nur 3 Minuten eingespart, aber weniger Fehlermeldungen angezeigt.
Hinzufügen
/mnt
(Windows NTFS-Partitionen) zum Ausschließen der ListeDas
/mnt
Verzeichnis enthält:C:
undE:
) auf einer SSD mit 105 GB DatenD:
) auf einer Festplatte mit 42 GB DatenWindows ist nicht von Interesse, daher schließen wir aus
/mnt
, um Zeit zu sparen:Jetzt
grep
dauert es nur noch 2 Minuten und 8 Sekunden. Durch das Ausschließen von Windows 10-Partitionen mit 147 Gib an Programmen und Daten werden 21,5 Minuten eingespart!Fügen Sie
/usr/src
Linux-Header hinzu, um die Liste auszuschließenDas
/usr/src
Verzeichnis enthält den Quellcode von Linux Headers. In meinem Fall sind mehr als 20 Kernel manuell installiert, was viel Platz beansprucht. So geben Sie das Verzeichnis an, obwohl das verwendete Argument lautetsrc
:Jetzt dauert grep nur noch 1 Minute und 15 Sekunden. Das Ausschließen
/usr/src
durch Angabesrc
in der--exclude-dir
Liste spart 53 Sekunden.Fügen Sie
/lib/modules
Kernelmodule hinzu, um die Liste auszuschließenDas
/lib/modules
Verzeichnis enthält kompilierte Kernelmodule. So geben Sie das Verzeichnis an, obwohl das verwendete Argument lautetmodules
:Durch das Überspringen von 6 GB Kernelmodulen
grep
beträgt unsere Zeit 36 Sekunden. Das Hinzufügen/lib/modules
durch Angabemodules
im--exclude-dir
Parameter spart 39 Sekunden.Verschiedene Verzeichnisse
Zusammenfassende Liste anderer Verzeichnisse:
quelle
--exclude-dir=tmp
jedestmp
Verzeichnis an einer beliebigen Stelle im Verzeichnisbaum ausgeschlossen wird. Also würde ich eher ausdrücklich empfehlen, die Verzeichnisse von der Wurzel auflisten , die sind grep werden, zum Beispielgrep -r pattern /bin /etc /home ...
.tmp
und sicher auch ausgeschlossen/home/Me/tmp
. Dies wurde behoben, indem/tmp
in `` exclude-dir. However if I used
/ sys` in exclude-dir verwendet wurde. Dann wurde es durchsucht, sodass essys
stattdessen so eingestellt werden musste. Sehr eigenartig. Vielen Dank für Ihre Eingabe und ich bin so froh, dass dieses langwierige Projekt vorbei ist :)