Ich fand ja rklms Ansatz am besten.
Und besser finde ich auch, den Dateinamen beim Start zu übergeben:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #!/bin/bash # datei=$1 # select auswahl in name ip domaene ABBRUCH do case $auswahl in name) spalte=1; break;; ip) spalte=2; break;; domaene) spalte=3; break;; ABBRUCH) exit 1; break;; *) echo fail Auswahl nicht angeboten;; esac done doppelte=($(sed -r 's/[ \t]+/;/g;s/.de~+/.de/' $datei | tr A-Z a-z | cut -d\; -f $spalte | sort | uniq -d)) for muster in ${doppelte[@]} do grep -i $muster $datei done |
Der Selectblock ermittelt die Spaltennummer.
sed -r 's/[ \t]+/;/g;
geht von ein oder mehreren Tabs oder Blanks als Spaltentrenner aus. Da ist vielleicht noch Handarbeit nötig. Es war nicht ganz durchsichtig, was da jetzt wirklich benutzt wird.
Die Tilden werden nur bei de~~ entfernt, bei .com, .org, .net usw. müsste man das ändern.
Tr ist das translatecommando, dass aus youTUBE youtube macht, aber radikal aus einer Domäne 00-CA-FE-CA-FE-00 auch 00-ca-fe-ca-fe-00 machen würde.
Cut schneidet dann die gewählte Spalte aus.
Sort/uniq -d wählen nur die verbliebenen doppelten aus. Der Output des Kommandos x wird mit $(x) in ein Array gesteckt durch runde Klammern: doppelte=($(x)).
Mit der For-Schleife greppen wir nach den Elementen des Arrays, -i um insensitiv gegenüber Groß-/Kleinschreibung zu sein (youTUBE).
Vorprogrammierte Fehler: Ein Name bar.de, der doppelt ist, triggert auch foobar.de. Das ist aber leicht zu heilen.