• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] grep -f ??????

Guten Abend,

ich habe ein paar Probleme mit grep -f (um Listen zeilenweise zu vergleichen und gleiche Inhalte auszugeben). Das Komando, das eigentlich funktionieren sollte lautet:

grep -f Liste1.txt Liste2.txt > gleiche.txt

Leider funktioniert das Komando so (scheinbar) nicht (die Datei gleiche.txt ist ohne Inhalt), sondern nur, wenn ich die Listen umdrehe:

grep -f Liste2.txt Liste1.txt > gleiche.txt.

Mir ist nur nicht klar warum? Gibt es bei grep irgendwelche Größenbeschränkungen o.ä.?

Weiterhin führt opensuse das Komando

grep -f Liste1.txt *.txt >> gleiche.txt

um den Inhalt von Liste1.txt mit mehreren .txt Dateien zu vergleichen anscheinend richtig aus (zumindest erscheint der Prozess richtig nach dem Aufruf der Prozessliste). Trotzdem bleibt die Datei gleiche.txt leer?!

In jeder Zeile der jeweiligen Listen steht nur ein Ausdruck. Ein Experiment mit einem zusätzlichen -F bzw. -x hat auch nichts gebracht.

Jetzt lege ich mir die Karten :-( und bitte Euch um Hilfe!

Grüße und vielen Dank schon mal

surferlein
 
A

Anonymous

Gast
Keine Ahnung was du hier genau machen willst und was für Dateien oder Listen du vergleichen willst.
Eine derartige Benutzung von grep ist immer mit Vorsicht zu genießen und artet sehr schnell zum Lügendetektor mit unberechenbaren Ergebnissen aus.

wenn das überhaupt einigermaßen funktionen soll, dann nur mit wirklich ausgesuchten Listen.
Ich habe mal folgenden kurzen Test gemacht
Code:
ls /tmp > liste1
ls /etc /tmp > liste2
grep -f liste1 liste2      # scheint zu funktionieren
grep -f liste2 liste1      # scheint auch zu funktionieren
grep -f liste2 /etc/fstab   # bringt plötzlich auch mehrere Ergebnisse aus der fstab die überhaupt nichts mit den Dateinamen zu tun haben
grep -f /etc/fstab list2     #bringt richtigerweise keine Ergebnisse.
Dann habe ich das ganze noch etwas extremer getestet, und zwar habe ich jetzt ein Script sowas ähnliches hier dazu genommen.
Code:
grep -f list2 script         # bringt mir Befehlszeilen die gar nichts mit Dateinamensliste zu tun haben
grep -f script liste2        # bringt mir hunderte von Dateinamen die mit Sicherheit nicht im Script stehen.
für ersthaftes Arbeiten mit verlässlichen Ergebnisse ist das also nur bedingt geeignet. Wenn du uns eventuell mal sagst was das für Listen sind, eventuell mit kleinem Ausschnitt, und was du warum vergleichen willst, dann können wird dir sicherlich was besseres und verläßlicheres als Vergleich heraussuchen.

robi
 
Guten Morgen, erstmal vielen Dank für die Hilfe.

Ich möchte Listen mit Nutzernamen (einen pro Zeile) gegeneinander laufen lassen und bin auf die selben Probleme wie Du gestoßen. Befinden sich die Dateien im selben Ordner funktioniert das einwandfrei. Wenn Liste1.txt (in meinem Beispiel) jedoch in einem anderen Pfad liegt, z.B. /home/xyz/logfiles und ich folgendes eingebe:

grep -f /home/xyz/logfiles/Liste1.txt Liste2.txt > vergleich.txt

kommt nichts raus.

Bei

grep -f Liste2.txt /home/xyz/logfiles/Liste1.txt > vergleich.txt

funzt das Ganze einwandfrei...

daher stell ich mir die Frage, ob es bei der Reihenfolge der Listen noch weiteres zu beachten gilt.

Aber wieso meinst Du, die Ergebnisse von grep sind mit Vorsicht zu genießen. Bisher habe ich mit grep sehr gute Erfahrungen gemacht...

Viele Grüße

surferlein
 
Habe das Problem gelöst. War am Ende ziemlich dämlich :-(

Das die Liste1.txt war ein Import von einem Windowsrechner. Am Ende jeder Zeile war noch ein verstecktes Steuerzeichen (festgestellt mittels mc), das vi nicht angezeigt hat. Hab die Liste jetzt mit dos2unix bearbeitet und schon funktioniert das alles wunderbar...

Vielen Dank für die Hilfe und sorry ob der dämlichen Lösung

Viele Grüße

surferlein
 
Das die Liste1.txt war ein Import von einem Windowsrechner. Am Ende jeder Zeile war noch ein verstecktes Steuerzeichen (festgestellt mittels mc), das vi nicht angezeigt hat.
vim zeigt in diesem Fall beim Öffnen in der unteren Zeile neben dem Dateinamen "[dos]" an.
vim kann es auch selbst umwandeln mit ":set fileformat=unix".

Gruß
 
Auch wenn Du den Fehler gefunden hast, würde ich dir für solche Vergleiche doch den diff-Befehl und seine grafischen Ableger ans Herz legen.
 
A

Anonymous

Gast
Geier0815 schrieb:
Auch wenn Du den Fehler gefunden hast, würde ich dir für solche Vergleiche doch den diff-Befehl und seine grafischen Ableger ans Herz legen.
diff für Vergleiche zwischen Dateien die nichts miteinander zu tun haben außer vielleicht ein paar gleiche Einträge :???: Na ich weiß ja nicht - bringt wohl ehr nicht viel.


Wenn die Listen mal etwas länger sind und die Ergebnisse durchaus etwas genauer und verläßlicher sein sollen, versuch mal das hier.
Code:
awk '{x[$0]+=1};END{for(i in x){if(x[i]>1)print i}}' liste1   liste2
sieht zwar kompliziert aus und wird wohl auch nicht jeder so einfach verstehen, ;) ist aber genauer und bestimmt einiges schneller als grep.
( Als Einschränkung für den Befehl gilt hier: es wird dabei nicht unterschieden ob ein Eintrag in einer Datei mehrfach oder in verschiedenen Dateien vorgekommen ist. Sobald ein Eintrag in der Gesamtsumme beider (oder aller angegebenen) Dateien mindestens 2 mal vorgekommen ist, erscheint er in der Ausgabe)

geht auch in einer Pipe anzuwenden um zB herauszufinden ob sich etwas oftmals (zeichengenau) wiederholt. Dieser Befehl hier zeigt zB alle Einträge in der /var/log/messages die mindestens 10 mal enthalten sind ( die Zeitenstempel werden vor der Verarbeitung mittels cut abgeschnitten)
Code:
cut -d " " -f4-  /var/log/messages | awk '{x[$0]+=1};END{for(i in x){if(x[i]>9)print i}}'

robi
 
Oben