Unix-Dienstprogramme wie sort, find, grep, diff et al. Sind sehr praktisch, um schnelle Aufgaben auszuführen, manchmal ohne Code zu schreiben.
Ich wollte wissen, welche Algorithmen sie intern verwenden und wie man einen bestimmten Algorithmus für eine bestimmte Aufgabe intelligent entscheidet. Wenn sort beispielsweise eine große Eingabedatei erhält, werden unterschiedliche Algorithmen für unterschiedliche Datengrößen verwendet?
Wechselt grep intelligent bei der Suche nach verschiedenen Datensätzen zwischen Algorithmen?
text-processing
grep
sort
coreutils
kamaal
quelle
quelle
grep
,egrep
oderfgrep
.Antworten:
Unix ist nur ein Standard, es gibt an, was die Implementierungen tun sollen, aber nicht, wie sie es tun sollen.
Daher verwenden Implementierungen von grep / sort / find höchstwahrscheinlich unterschiedliche Ansätze auf unterschiedlichen Systemen (und selbst bei einem System wie Linux gibt es gleichzeitige Implementierungen).
Unter Linux können Sie jederzeit in den Quellcode schauen.
quelle
Möglicherweise interessieren Sie sich für diesen Mailinglistenbeitrag des ursprünglichen GNU-Grep-Autors, in dem einige der GNU-Grep-Optimierungen erläutert werden. Eine weitere unterhaltsame Erkundung durch lächerliche Fische (Autor von Hex Fiend)
quelle
Der UNIX-Standard legt keine Implementierungsdetails für die Standardsystemtools fest, außer in wirklich seltenen Fällen. Die neueste Version der Single Unix-Spezifikation finden Sie hier (Warnung: Registrierung erforderlich).
In diesem Sinne hat jedes UNIX (System V und direkte Nachkommen wie BSD, Solaris, Mac OS X usw.) oder UNIX-basierte Betriebssystem (weit entfernte Nachkommen oder gleichartige: Linux, Minix) seine eigenen Implementierungen der in beschriebenen Programme die UNIX-Spezifikation. Zum Beispiel. einen Blick auf FreeBSD und Linux / GNU Coreutils . Beachten Sie, dass einige Tools wie GNU diff oder GNU grep eigenständige Projekte sind . Eine weitere Tatsache ist, dass einige Implementierungen dieser Tools möglicherweise standardmäßig in andere UNIX-ähnliche Systeme gelangen als diejenigen, für die sie ursprünglich geschrieben wurden, z. B. einige Gnu-Coreutils in Freebsd oder GCC.
Bonus: Um Ihren Kopf um den UNIX-Stammbaum zu wickeln, sehen Sie sich dieses Diagramm an .
quelle
Das ist eine interessante Frage (+1 dafür). Ich habe keine Ahnung, wie die Antwort lautet, aber wenn ich Sie wäre, würde ich mir den Quellcode typischer GNU-Dienstprogramme ansehen, um eine Vorstellung von deren Algorithmen zu bekommen.
Das glaube ich nicht. Zitiere mich nicht, da ich es dir nicht mit 100% iger Sicherheit sagen kann, aber ich denke wirklich nicht. Die UNIX-Philosophie der Dinge ist, dass eine Sache eine Sache und nur eine Sache tut. Deshalb haben wir mehrere Versionen von grep (haben
grep
,egrep
,fgrep
).Die Idee ist auch, eine Sache und nur eine Sache zur Laufzeit zu tun. Unterschiedliche Verhaltensweisen und Algorithmen können als Befehlszeilenargumente konfiguriert werden, sodass dasselbe Programm zwischen den Läufen leicht unterschiedlich (und möglicherweise etwas optimierter) agieren kann. Gute Beispiele sind der Befehl
wc
unddiff
.Die Verhaltensanpassung ist jedoch konfigurationsbasiert (über cmd-Zeilenargumente). Sie ändern / passen das Verhalten zur Laufzeit nicht an. Es ist normalerweise eine unnötige Komplexität für die Art von Artefakten, die die UNIX-Tools anstreben.
Diese Komplexität ist besser geeignet für komplexere, weniger universelle Tools IMO.
quelle
Ich glaube nicht, aber es wechselt zum "schnellen" Nicht-RE-Algorithmus, wenn das Flag -f angegeben wird (oder als fgrep aufgerufen wird).
quelle