• 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] Hilfe für ein Shellskript

ceegee

Hacker
Hi,

ich muss eine aliases Datei so aufbereiten, dass man die Einträge in eine Datenbank schreiben kann. Da das Volumen der Einträge recht viel ist, will ich das per Skript machen. Das ganze sieht so aus, bzw. soll so aussehen wie in dieser Datei:

http://phpfi.com/312273

Ich hatte verschiedenes probiert, aber keins führte zum Erfolg. Versucht hatte ich eine rekursive Schleife, die "außen" die Verteiler als solche durchläuft und "innen" die Zieladressen verarbeitet. Habe die Codebeispiele jetzt nicht zur Hand, liegt in der Firma. Wäre für gute Tips dankbar!

Gruß Christian
 

scummos

Hacker
Da du schon auf phpfi.com als paste gelandet bist, wäre ein PHP-Skript möglich? Da könnte ich dir helfen. Mit zwei explodes ist das recht schnell erledigt... ;)
 
OP
C

ceegee

Hacker
Klar aber morgen erst, das angefangene Script ist in der Firma. Danke schonmal!

Christian
 

Zappo

Newbie
Bist gerade abgehauen, als ich fertig geworden bin. Naja, hier eine bash-Lösung.
Code:
#!/bin/bash
line='verteiler: test1@test.de,test2@test.de,test3@test.de'
foo=$(echo $line | cut -d':' -f1)

bar=$(echo $line | cut -d' ' -f2)
IFS=","
for baz in $bar; do
        echo ${foo}@domain.de $baz
done
unset IFS

Sieht dann in Aktion so aus
Code:
$ bash ceegee.sh 
verteiler@domain.de test1@test.de
verteiler@domain.de test2@test.de
verteiler@domain.de test3@test.de
 

gameboy

Hacker
Meine Lösung in Perl (ohne Schleife!):

Code:
#!/usr/bin/perl

my $ausgabe = shift;
my $verteiler = '';

$ausgabe =~ s/^(.*?): //;
$verteiler = "$1\@domain.de";
$ausgabe =~ s/([^,]+),?/$verteiler $1\n/g;
print $ausgabe;
Test-Aufruf:
Code:
./testscript.pl "verteiler: user1@example.com,user2@example.com,user3@example.com,user4@example.com,user5@example.com"
Ausgabe:
Code:
verteiler@domain.de user1@example.com
verteiler@domain.de user2@example.com
verteiler@domain.de user3@example.com
verteiler@domain.de user4@example.com
verteiler@domain.de user5@example.com
Viele Grüße,
gameboy.
 
Also ich finde das als reinen Bash-Code elegant:

Code:
# Inhalt von Datei: line='verteiler: test1@test.de,test2@test.de,test3@test.de'

while read line
do
        verteiler=${line//:*}
        rest=${line//*:}

        for mail in  ${rest//,/ }
        do
                echo $verteiler@domain : $mail
        done
done <Datei

Haveaniceday
 
OP
C

ceegee

Hacker
Moin zusammen,

vielen Dank für die vielen Antworten. Habe als erstes das Skript von Zappo getestet und hatte damit Erfolg. Ich wusste nicht das es die Variable IFS gibt und was sie macht. Wieder was gelernt :)

Trotzdem besten dank an euch anderen :)

Für die Nachwelt hier mal das ganze Skript:

Code:
#!/bin/bash

a=1

while [ $a -le `cat verteiler-extern | wc -l` ]; do
  line=`cat verteiler-extern | sed -n $a"p"`

  alias=$(echo $line | cut -d':' -f1)
  temp=$(echo $line | cut -d' ' -f2)

  IFS=","

  for dest in $temp; do
    echo "INSERT INTO virtual (alias,dest,username,status) VALUES('${alias}@domain.de','$dest','domain.de','1');"
  done

  unset IFS

  let a=a+1
done


Gruß Christian
 

regexer

Advanced Hacker
Noch ein Tipp: Zeilenweises lesen funktioniert auch wiefolgt:
Code:
while read line
do
  echo $line
done </my/file.txt
Allerdings weiß ich nicht, ob man den IFS zwischendurch auf "," setzen darf. Ich würde sagen ja, aber vielleicht einfach mal ausprobieren...
 
Oben