ubuntuusers.de

text vergleichen

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

Behind_These_Walls

Anmeldungsdatum:
7. März 2007

Beiträge: 291

Hoi,
wie vergleiche ich am Besten den Output von einem Programm mit dem einer Datei?
hab ein bisschen mit diff rumgespielt, weiss aber nicht wie ich das anstellen soll.
Schon mal danke

Greebo

Avatar von Greebo

Anmeldungsdatum:
21. November 2006

Beiträge: 3443

Wohnort: 97070 Würzburg

Also den Output eines Programms kannst du jederzeit in eine Datei umleiten

myprogramm &> output.txt


Und mit diff vergleichen ist dann einfach

diff datei1 datei2


Ggf. mit anderen Parametern, aber da müsste man wissen was du eigentlich an Erkenntnis dabei schöpfen willst 😉

audax

Avatar von audax

Anmeldungsdatum:
15. September 2006

Beiträge: 1253

Alternativ, in der Zsh:

diff =(my_program with arguments) other_file

Behind_These_Walls

(Themenstarter)

Anmeldungsdatum:
7. März 2007

Beiträge: 291

audax hat geschrieben:

Alternativ, in der Zsh:

diff =(my_program with arguments) other_file

so hab ich's mir gedacht, danke euch beiden.

audax

Avatar von audax

Anmeldungsdatum:
15. September 2006

Beiträge: 1253

Wow, die Zsh hat mal gewonnen! Einfachheit ftw! \o/

nox24

Avatar von nox24

Anmeldungsdatum:
8. Februar 2008

Beiträge: 1260

Wohnort: /home/karlsruhe/

Hallo,

ich hoffe Ihr seht es nicht als Thread-Hijacking an.

Gibt es eine Möglichkeit anstatt 2 Textdateien, nur 2 beliebig lange Zeichenfolgen im Terminal abzugleichen?

Gibt es dafür ein Programm?

Programmname 107ae1ee8d8263b6fc40c0c809451a1a2e4f21ad3e1d5613f4090e07b695cdd9 107ae1ee8d8263b6fc40c0c809451a1a2e4f21ad3e1d5613f4090e07b695cdd9

z.B. will ich diese zwei Zeichenfolgen abgleichen

Ich weiß man kann es auch optisch abgleichen, da die Zeichenfolge nicht zu lang ist. Es wäre einfach schneller im Terminal abzugleichen. Habe im Forum nichts finden können und Textdateien vergleichen bezieht sich nur auf Dateien.

LG Benjamin

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Du könntest Prozesssubstitution nutzen und damit zwei „virtuelle“ Dateien erzeugen. Das kannst du dann auf ein Diff-Tool deiner Wahl loslassen. ☺

1
vimdiff <(echo '107ae1ee8d8263b6fc40c0c809451a1a2e4f21ad3e1d5613f4090e07b695cdd9') <(echo '107ae1ee8d8263b6fc40c0c809451a1a2e4f21adee1d5613f4090e07b695cdd9')

nox24

Avatar von nox24

Anmeldungsdatum:
8. Februar 2008

Beiträge: 1260

Wohnort: /home/karlsruhe/

Danke Vain!

Mit dem Tool diff und der Option -s bin ich zufrieden:

diff -s <(echo '107ae1ee8d8263b6fc40c0c809451a1a2e4f21ad3e1d5613f4090e07b695cdd9') <(echo '107ae1ee8d8263b6fc40c0c809451a1a2e4f21ad3e1d5613f4090e07b695cdd9')
Dateien /dev/fd/63 und /dev/fd/62 sind identisch.

Wozu dient eigentlich dieses Verzeichnis /dev/fd im System?

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

nox24 schrieb:

Wozu dient eigentlich dieses Verzeichnis /dev/fd im System?

Wenn du mal nachschaust, …

$ ls -al /dev/fd
lrwxrwxrwx 1 root root 13 Aug 24 22:57 /dev/fd -> /proc/self/fd

… dann siehst du, dass das ein Link ist. Und /proc/self ist nochmal ein Link:

$ ls -al /proc/self
lrwxrwxrwx 1 root root 64 Aug 25 00:57 /proc/self -> 19992

Damit ist die PID des aktuellen Prozess gemeint, in diesem Falle ls. Für jeden laufenden Prozess gibt es ein Verzeichnis unter /proc, schau einfach mal rein. ☺ Dort gibt es Informationen zu den Prozessen, darunter eben auch das fd-Verzeichnis. Wenn du eine Datei öffnest, dann bekommt sie einen „Deskriptor“ zugeordnet. Das ist einfache eine Nummer, über die die jeweilige Datei identifiziert wird. Und diese Nummern liegen pro Prozess gesammelt in /proc/<pid>/fd oder (aus der Sicht eines jeden Prozesses) /dev/fd.

Kurz: In /dev/fd liegen die Dateideskriptoren des aktuellen Prozesses. 😉


Die Prozesssubstitution oben in dem Befehl macht folgendes: Sie startet das, was in den Klammern steht, im Hintergrund (hier ein einfaches echo). Die Ausgabe des Befehls landet normalerweise auf stdout, aber stdout ist auch nichts weiter als eine „offene Datei“. Dieses stdout wird von der Prozesssubstitution jetzt so umgebogen, dass es nicht im Terminal landet, sondern in einer Pipe (damit ein gewisser Puffer da ist und so weiter).

Das andere Ende der Pipe, also das, wo die Daten wieder rauskommen, landet als fertiger Deskriptor im Pool der offenen Dateien des diff-Prozesses. Da diff aber erstmal nicht weiß, dass diese beiden Dateien offen und lesbar sind, ersetzt die Shell den kompletten <(...)-Teil durch zwei Strings, die /dev/fd/... enthalten. Das kann diff dann ganz normal wie jede andere Datei auch öffnen.

Vielleicht mal noch zur Verdeutlichung:

$ ls -al <(echo 'hi') /dev/fd/
lr-x------ 1 void users 64 Aug 25 02:05 /dev/fd/63 -> pipe:[1339849]

/dev/fd/:
total 0
dr-x------ 2 void users  0 Aug 25 02:05 .
dr-xr-xr-x 7 void users  0 Aug 25 02:05 ..
lrwx------ 1 void users 64 Aug 25 02:05 0 -> /dev/pts/1
lrwx------ 1 void users 64 Aug 25 02:05 1 -> /dev/pts/1
lrwx------ 1 void users 64 Aug 25 02:05 2 -> /dev/pts/1
lr-x------ 1 void users 64 Aug 25 02:05 3 -> /proc/21372/fd
lr-x------ 1 void users 64 Aug 25 02:05 63 -> pipe:[1339849]

Der gelb markierte Teil wird ersetzt durch /dev/fd/63. Da kommt die Ausgabe von echo raus (welche in dem Beispiel aber nicht ausgelesen wird). Das heißt, die Zeile, die ls sieht, sieht eigentlich so aus:

$ ls -al /dev/fd/63 /dev/fd/

Deswegen siehst du oben zuerst einmal die Informationen zu /dev/fd/63 und danach noch einmal den kompletten Inhalt von /dev/fd/, also alle offenen Deskriptoren des ls-Prozesses. Darunter ist eben auch die 63 und das ist eigentlich keine Datei, sondern eine Pipe, wie man sieht. Am anderen Ende wartet echo. ☺

Vielleicht auch mal den Debug-Modus der Shell anschalten, dann sieht man das auch sehr schön:

$ set -x
$ diff -s <(echo 'hallo') <(echo 'hallo')
+ diff -s /dev/fd/63 /dev/fd/62
++ echo hallo
++ echo hallo
Files /dev/fd/63 and /dev/fd/62 are identical


Okay, ich glaube, das war jetzt viel zu weit abgeschweift. Egal. Hoffe, dass ich das zu später Stunde noch halbwegs sinnvoll rübergebracht habe. 😉

Antworten |