h1

Emailadressen aus dem WWW filtern

Oktober 21, 2008

Letztens bei einem Artikel über awk, wollte Charly ein Beispiel sehen. Jetzt habe ich eins. awk lässt sich herrvoragend dazu nutzen, Email-Adressen aus Textdateien zu filtern.

Dazu folgende Datai, emails.awk:

{
  for(i=1;i<=NF;i++)
    {
      if ($i ~ /[a-zA-Z\-_0-9\.]*@[a-zA-Z\-0-9]*\.[a-zA-Z][a-zA-Z][a-zA-Z]?/ )
      {
        print $i
      }
   }
}

Dieses Script ruft man dann wie folgt auf:

awk -f emails.awk emails.txt

Wobei die Option -f einfach bewirkt, dass die Befehle aus der Datei emails.awk gelesen werden. Das script wird auf emails.txt angewendet, in der beliebiger Text stehen kann, und filtert alle Email-Adressen heraus.

Um das Script zu verstehen, muss man wissen, dass awk seine Kommandos auf jede Zeile anwendet. In jeder Zeile gibt es awk Felder. Ein Feld ist eine beliebige Zeichenfolge, die durch Leerzeichen von anderen Felder abgegrenzt ist.

Beispiel:

blubb hallo welt

Diese Zeile hat 3 Felder, Feld 1 enthält „blubb“, Feld 2 enthält „hallo“ und Feld 3 enthält „welt“. Mit der Variablen $n kann man auf das n-te Feld einer Zeile zugreiffen. Folglich enthält $1 „blubb“ usw. . Die Anzahl der Felder wird automatisch in der Variablen NF gespeichert.

Der „spannende Punkt“ der Datei ist die Zeile:
if ($i ~ /[a-zA-Z\-_0-9\.]*@[a-zA-Z\-0-9]*\.[a-zA-Z][a-zA-Z][a-zA-Z]?/ )

Die Variable $i enthält das i-te Feld der Zeile. Mit ~ prüft man ob ein String auf den regulären Ausdruck rechts vom Operator passt, also ob der Ausdruck /[a-zA-Z\-_0-9\.]*@[a-zA-Z\-0-9]*\.[a-zA-Z][a-zA-Z][a-zA-Z]?/ beim i-ten Feld zutrifft. Der reguläre Ausdruck setzt sich wiefolgt zusammen:

[a-zA-Z\-_0-9\.]* – beliebig viele Zeichen aus allen Buchstaben (groß und klein), allen Zahlen, dem Bindestrich, dem Unterstrich und dem Punkt.

@ – das @-Zeichen

[a-zA-Z\-0-9]* – beliebig viele Zeichen aus allen Buchstaben (groß und klein), allen Zahlen und dem Bindestrich (für den Domainnamen)

\. – der Punkt als Trennzeichen von Domainnamen und Domainendung

[a-zA-Z][a-zA-Z][a-zA-Z]? – 2 oder 3 Zeichen (? steht für „kann genau 1 mal vorkommen, muss aber nicht) aus allen Buchstaben für die Domainendung

Passt ein Feld auf den regulären Ausdruck, wird es dann ausgegeben.

Wenn man weiter denkt, braucht man nur noch ein Script, das sich von Internetseite zu Internetseite hangelt und dort mit dem awk-script die Emailadressen herausfiltert.

Was man dann mit den Emailadressen macht, sei ja jedem selbst überlassen.😀

One comment

  1. […] Perl, Python, regular Expressions, time | by Thomas Da ich schon vor kurzem einen Artikel über das Filtern von Text nach E-Mailadressen mithilfe von awk geschrieben habe, sind Charly und ich auf die Idee gekommen, zu vergleichen, welche Sprache oder […]



Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: