PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Script - Mail Black List sortieren...



robert
12-09-2006, 06:59
Hallo,

eine kleine Frage.
Ich habe eine Mail Black List die sich etwas aufgebläht hat. Diese möchte ich gerne mal nach Top Level Domain (also von hinten nach vorne) sortieren und ausmisten.
Da ich dieses wirklich nur alle Jubel-Jahre mal machen will, benötige ich ein Script, das mir das möglichst ohne großen Aufwand macht.
Und da man ja bekanntlich das Rad nicht zwei mal neu erfinden soll, habe ich schon bei Google gesucht. Leider ohne nutzbares Ergebnis.

Hat jemand zufällig ein kleines (Shell-)Script herum liegen und würde dieses weiter geben?

Und bitte, keine Antworten wie, das ist so einfach, setz dich selber hin.
Das werde ich tun, wenn ich keine einfache (existierende) Lösung finde, aber ich bin inzwischen der Ansicht, dass man gerade bei Linux nicht alles doppelt und dreifach neu machen (erfinden) muss. Das machen andere schon zu genüge.
Wenn niemand so etwas herum liegen hat, einfach nicht antworten. Dann werde ich mich mal bei Gelegenheit hin setzen und meine alten Perl/Shell-Scipt Kenntnisse wieder aus der Schublade kramen müssen.

Danke!

Romanday
12-09-2006, 07:57
Hallo,
Diese möchte ich gerne mal nach Top Level Domain (also von hinten nach vorne) sortieren und ausmisten.
Danke!

Das ist eine nicht so besonders schwierige Aufgabe.

Ich weiß nicht wie schnell du eine Lösung brauchts,
aber vielleicht könnte man dies als User Aufgabe benutzen.

Wenn dir das recht ist.

Wie z. B.
http://www.mrunix.de/forums/showthread.php?t=45478&highlight=Sport

Jeder kann mitmachen + es kommen Lösungen in unterschiedlichen Sprachen zustande. (hoffentlich)

robert
12-09-2006, 08:40
Hallo,

ich habe meine alten Kenntnisse doch mal wieder raus gekramt und selber was zusammen gebastelt. Hatte gerade etwas Zeit und wollte das erledigt haben. :)

Keine Ahnung ob die Lösung optimal ist, aber sie erfüllt ihren Zweck.

Ich sollte vielleicht dazu sagen, dass die Liste je Zeile eine Mail Adresse enthält, wobei die Namen vorher durch ein '*' ersetzt werden.
Also aus einem name@domain.tld wird ein *@domain.tld. Das könnte ich aber auch noch in das Script einbauen.


#!/bin/sh
#
# Sortiere Mail Liste nach TopLevelDomain
#

TLDLIST="/tmp/tldlist.tmp"
TMPTLD1="/tmp/tldlist1.tmp"
TMPTLD2="/tmp/tldlist2.tmp"

if [ "$1" = "" ]; then
echo "Usage: $0 <List-File>"
exit 1
fi

I=0
if [ -f "$1" ]; then
sort -u "$1" > $TLDLIST
# echo "Lese $1 ein..."
cat "$TLDLIST" | while read; do
(( I++ ))
IO=`printf "%02d" $I`
TLD=${REPLY##*.}
# echo "$IO: $TLD"
if [ -n "$TLD" ]; then
echo ".$TLD" | tr "A-Z" "a-z" >> $TMPTLD1
fi
done

sort -u $TMPTLD1 > $TMPTLD2
rm $TMPTLD1
cat $TMPTLD2 | while read; do
grep "${REPLY}$" $TLDLIST >> $TMPTLD1
done
grep "@" $TMPTLD1 > "${1}.sorted"
else
echo "$1 is not a file!"
exit 1
fi

rm $TMPTLD1 $TMPTLD2 $TLDLIST


Die Variable I und die echo Ausgaben waren nur für mich zum Test... :)
Also einfach alles damit ignorieren.

Romanday
12-09-2006, 17:14
Hallo,

ich habe meine alten Kenntnisse doch mal wieder raus gekramt und selber was zusammen gebastelt. Hatte gerade etwas Zeit und wollte das erledigt haben. :)


Auch eine Möglichkeit sich darzustellen.:D
Das könntest Du aber viel einfacher haben.

Einfach die Scripte auf deiner Page dokumentieren +
Link in der Sig. zu deiner Page.

robert
12-09-2006, 23:36
Hmm? Darstellen?

Nee, ich wollte das einfach weg haben und habe mal ein paar alte Unix Bücher durchforstet.
Hätte selber nicht gedacht, dass ich das noch so hin bekomme. Schon lange nichts mehr in der Art gemacht. :)
Wenn du übrigens Verbesserungsvorschläge für das Scipt oder ein besseres hast, nur zu, ich bin immer für Vorschläge zu haben.

Gruß

Robert

Romanday
13-09-2006, 09:20
Wenn du übrigens Verbesserungsvorschläge für das Scipt oder ein besseres hast, nur zu, ich bin immer für Vorschläge zu haben.

Gruß

Robert

Das ist ein wenig fummelig das über die Shell zu lösen, da die Shell
nur eingeschränkt mit Arrays umgehen kann.
Ich hätte das in einer Scriptsprache in der 2. Dimension gemacht.
Dann hätte man 1 Lese + 1 Schreibvorgang sparen können.

zst
13-09-2006, 22:27
Hallo Robert,

ich habe eine etwas kleinere und vielleicht auch übersichtlichere Lösung für Dich. Probier´s doch damit mal.

Übrigens:
- es war nicht fummelig über die Shell ...
- ich brauchte keine Arrays dazu ...
- auch eine Scriptsprache der 2. Dimension scheint mir unnötig ...
- gespart wurde lediglich mit konkreten Vorschlägen ...
---> daher mal mein Entwurf für Dich

Viele Grüße
zst




#!/bin/bash
# Mailadressen nach Top-Level-Domain sortieren
# 13.09.2006 - zst

if [ $# -ne 1 ]
then
echo "Aufruf mit Adressliste!"
exit 1
fi

rm -f $1.neu

if [ -f $1 ]
then
tr "A-Z" "a-z" < $1 | sort -u >$1.sort
cut -d "@" -f2 $1.sort >$1.tld
for i in `cut -d"." -f2 $1.tld | sort -u`
do
grep "${i}$" $1.sort >>$1.neu
done
fi

rm $1.tld
rm $1.sort

echo "Ergebnis in $1.neu"
cat $1.neu

Joghurt
14-09-2006, 21:10
awk -F. '{for (i=NF;i>1;i--) {printf "%s.",$i} print $1}' DATEINAME | sort | awk -F. '{for (i=NF;i>1;i--) {printf "%s.",$i} print $1}'

Romanday
15-09-2006, 05:16
awk -F. '{for (i=NF;i>1;i--) {printf "%s.",$i} print $1}' DATEINAME | sort | awk -F. '{for (i=NF;i>1;i--) {printf "%s.",$i} print $1}'

:D


awk -F. '{print $2"."$1 }' F | sort | awk -F. '{print $2"."$1 }'


Er kann das natürlich auch in Vi mit einer Rückreferenzierung lösen.

robert
15-09-2006, 06:56
Hallo,

das sieht natürlich alles etwas besser aus als bei mir. Ich habe es mir gerade so zusammen gefummelt, wie ich es noch aus Büchern zusammen bekommen habe.

@Romanday
Mein Problem ist einfach, dass ich das Script wirklich nur alle 2-3 Monate mal zum "Säubern" auf der Konsole starte. Von daher kommt mir ein einfaches Shell-Script bzw. ein Shell-Command natürlich entgegen.

@ZST
Wenn du nichts dagegen hast, übernehme ich deines mal. Das sieht sauberer aus als bei mir. :)
Allerdings fällt mir dabei auf, dass die Zeilen, die kein '@' enthalten, bei dir nicht ausgefiltert werden.
Das hatte ich bei mir mit dem 'grep "@" ' gemacht, da manche Zeilen eben eine ungültige Mail Adr. enthalten, also ohne '@' Zeichen.
Aber die eine Zeile kann ich ja noch einfügen.

Gruß

Robert

/Nachtrag
@ZST bei deinem Script scheinen danach einige Zeilen/Einträge zu fehlen.
Ich habe meines noch mal etwas "überarbeitet".


#!/bin/sh
#
# Sortiere Mail Liste nach TopLevelDomain
#

TLDLIST="/tmp/tldlist.tmp"
TMPTLD1="/tmp/tldlist1.tmp"
TMPTLD2="/tmp/tldlist2.tmp"

if [ "$1" = "" ]; then
echo "Usage: $0 <List-File>"
exit 1
fi

if [ -f "$1" ]; then
sort -u "$1" | sed "s/*/*@/" | sed "s/@@/@/" | tr "A-Z" "a-z" > $TLDLIST
echo "" > $TMPTLD1
cat "$TLDLIST" | while read; do
TLD=${REPLY##*.}
if [ -n "$TLD" ]; then
echo ".$TLD$" >> $TMPTLD1
fi
done
sort -u $TMPTLD1 > $TMPTLD2

echo "" > $TMPTLD1
grep -f $TMPTLD2 $TLDLIST >> $TMPTLD1
grep "@" $TMPTLD1 > "${1}.sorted"
else
echo "$1 is not a file!"
exit 1
fi

rm $TMPTLD1 $TMPTLD2 $TLDLIST

Joghurt
15-09-2006, 08:30
:D


awk -F. '{print $2"."$1 }' F | sort | awk -F. '{print $2"."$1 }'

Aus "blabla.dyndns.org" wird dann "org.dyndns"...
Domainnamen können auch mehr als 1 subdomain haben ;)

Romanday
15-09-2006, 09:51
Aus "blabla.dyndns.org" wird dann "org.dyndns"...
Domainnamen können auch mehr als 1 subdomain haben ;)

Stimmt, hatte ich vergessen.



awk '/@/{b=match($0,/[^.]+$/);s=substr($0,RSTART,RLENGTH); print s"|"$0 }' z|sort|awk '{gsub(/^[^|]+./,"",$0);print $0}'

Romanday
15-09-2006, 11:19
Wem das doch zu heftig ist nimmt die schnellere Tricki Version.:D



awk -F. '/@/{print $NF,$0 }' F | sort | awk '{print $2}'