Wie intelligent sind Unix-Dienstprogramme?

8

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?

kamaal
quelle
4
Sie sind so intelligent, dass sie eines Tages die Erde übernehmen werden. Aber jetzt müssen Sie entscheiden , welche Sie verwenden werden, wie grep, egrepoder fgrep.
Keith
1
Aber wenn Sie egrep regelmäßig verwenden und dann plötzlich zu fgrep wechseln, könnte es sich entscheiden, Sie im Schlaf zu töten, weil Sie untreu sind.
Shadur
1
Sie sind so intelligent wie die Hände, die sie führen.
Luis.espinal

Antworten:

7

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.

Šimon Tóth
quelle
2
Um Ihre Antwort zu vervollständigen: gnu.org/software/coreutils
sahid
Warum sollten Sie sich den Quellcode ansehen? greps-Algorithmen sind bekannt und dokumentiert. Es ist sogar in der Wikipedia-Seite für grep. Link
Gelöschter Account
@ Gelöscht Ich denke, dass Sie Prinzipien mit der Implementierung verwechseln.
Šimon Tóth
@Let_Me_Be: Der Algorithmus und sogar die Implementierung sind bekannt und dokumentiert. Link Link
Gelöschter Account
@ Gelöscht Vielleicht verstehe ich nicht, was Sie sagen wollen, aber dass Linux grep von coreutils einen bestimmten Algorithmus verwendet, bedeutet nicht, dass alle Implementierungen diesen Algorithmus verwenden. Und ja, Sie haben Recht damit, dass Algorithmen in der Regel bekannt sind (da dies der Sinn des Entwurfs ist).
Šimon Tóth
2

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)

Nicht sicher
quelle
1

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 .

Shinnok
quelle
0

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?

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.

Wechselt grep intelligent bei der Suche nach verschiedenen Datensätzen zwischen Algorithmen?

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 wcund diff.

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.

luis.espinal
quelle
2
Das Thema hier ist eher Nein, sie sind tatsächlich dumm! . Sie müssen ihnen genau sagen, was sie tun müssen. Wie auch immer, wir wollen nicht, dass sie uns gegenüber zu schlau sind, wissen Sie.
Tshepang
0

Wechselt grep intelligent bei der Suche nach verschiedenen Datensätzen zwischen Algorithmen?

Ich glaube nicht, aber es wechselt zum "schnellen" Nicht-RE-Algorithmus, wenn das Flag -f angegeben wird (oder als fgrep aufgerufen wird).

kmarsh
quelle
dh nicht wirklich intelligent :)
Tshepang