Marcel Eichner // Ephigenia

  • Home
  • Illustration
  • Code
  • Kontakt

Aktuelle Projekte

Horrorblog.org
jQuery.slideShow
Franklin
code.marceleichner.de

This Blog-Website is built with Harrison!

Blogs & Freunde

Gimmixx
Martin Fleck
Torsten Bergler
Jens Franke
Robokid
Peter Kröner
Polycoder
Coding Horror
Lotterliebe
CodeBalancer
Pseudocoder
Migrador
Dachdeckermeister Peter Arold in Werda, Plauen, Hof und Umgebung La Petite Provence - Pension und Festsaal in Leisnig Piv-Berlin, Immobilienverwaltung Verwaltung Berlin blogoscoop

#494

02.05.2010 21:25
3 Kommentare
Share
  • code
  • tutorial
  • tool
  • script
  • bash
  • shell
  • Gewinner
  • Email
  • Verlosung
  • Beispiel
  • Datei
Wie manche von euch wissen betreibe ich seit einiger Zeit ja ein kleines aber mittlerweile echt ganz gut erfolgreiches Blog über Horror- und Fantasyfilme. Bei dem dritten Gewinnspiel haben über 150 Leute mitgemacht und mir eine Email geschickt. Leider etwas viele um per Losverfahren Gewinner auszuwählen. Das folgende Beispiel wird für erfahrene Programmierer nichts neues sein oder total langweilig. Eventuell hilft’s aber dem einen oder anderen weiter ;-)

Einfach mit OSX Mail die Mails extrahieren, die das richtige Lösungswort enthalten, oder die man untersuchen möchte. Dabei erstellt Mail einfach eine Datei mit allen Email-Quelltexten untereinander in einer Textdatei. Diese kann man super mit der Bash maltretieren und die Absenderadresse extrahieren:
grep -Z -P '^From:s(.+)' mail_export.txt | uniq
Wenn man dann noch zwei Gewinner auswählen möchte, braucht man nur doch die Anzahl der Zeilen in der Datei und wählt dann einfach zwei aus. Das ganze Shell-Script sieht dann so aus:
#!/bin/bash
##########################################################
# Extract n radom emails from a file
#
# Usage:
#   winner.sh [filename] [count]
#
# Author: Marcel Eichner // Ephigenia <love@ephigenia.de>
# Date: 2009-03-30
##########################################################
TMPFILE=`mktemp -t emails` || exit 1
grep -Z -P '^From:s(.+)' "$1" | uniq > $TMPFILE
# select random line from file
LCOUNT=`wc -l "${TMPFILE}" | awk ' { print $1; }'`
echo "Choosing ${2:-1} winners from ${LCOUNT} emails"
for (( i = 0 ; i < ${2:-1}; i++ ))
do
  LINENUMBER=$((($RANDOM % $LCOUNT) + 1))
  sed -n ${LINENUMBER}p ${TMPFILE}
done

Das Script kann wenn es ganz doof kommt auch zwei mal die gleichen Absender auswählen. Wenn das passiert kann man das Bash-Script ja gleich noch mal laufen lassen. Danke an Caspar der noch weitere hilfreiche Anregungen gegeben hat!

Kommentare

03.05.2010 10:03
ccm
Hey,

da sind ein, zwei Fehler drin:

1. Du definierst "filename" als Variable, verwendest es zwei Zeilen höher aber statisch.
2. Sieh Dir mal "mktemp" an, damit kannst Du temporäre Dateien in Skripten erstellen, ohne Dich um einen zufälligen Dateinamen kümmern zu müssen.
3. In der "echo"-Zeile verwendest Du verschaltete Anführungszeichen, das gibt sicher einen Syntax-Error.
4. Variablen sollte man in Shell-Skripten nach möglichkeit so verwendenten ${VARIABLE} statt $variable - auch hat sich eingebürgert, sie eher groß zu schreiben.
5. In den grep kann wahrscheinlich an den Anfang noch ein "^".
6. Das Ausgeben nur einer Zeile geht sich etwas eleganter :)

Grüße,

ccm.
03.05.2010 10:16
Marcel Eichner
Vielen Dank für deine Tipps Caspar. Weiss ich zu schätzen. Hab’ das Script angepasst. Wie würdest du das als Einzeiler formulieren? Hab ich auch probiert … aber nicht hinbekommen …
03.05.2010 10:40
ccm
Hey,

das Schweizer Taschenmesser "sed" hilft hier weiter:

sed -n ${LINENUMBER}p {FILENAME}

Mit awk ginge das definitiv auch.

Grüße,

ccm.

Kommentar hinterlassen

Deine E-Mail Adresse wird nicht veröffentlicht. Wenn Du bei gravatar ein Bild für deine E-Mail Adresse hinterlegt hast, wird dieses neben Deinem Namen angezeigt.

marceleichner HTML5 Harrison Theme (Validate Source), © 2010 by Ephigenia M. Eichner, Impressum