PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : shell script hilfe



xJAMESx
28.01.11, 10:48
Hallo,

leider habe ich keine ahnugn von shell scripten, also ich bin ganz neu in diesem breich :)

ich muss ein script erstell das das macht:

2 text daten vergleicht ob die emails in beiden vorkommen, dann 2 dateien erstellt, einmal eine datei mit den emails die vorkommen, und eine datei die die emails aufzeigt die nicht in beiden datei vorkommen.

bitte helft mir

MFG

muell200
28.01.11, 11:36
bitte helft mir


stichpunkte bzw. befehle fuer dein script:

diff
grep
if
touch

eule
28.01.11, 11:52
http://www.tldp.org/LDP/abs/html/

xJAMESx
28.01.11, 11:55
stichpunkte bzw. befehle fuer dein script:

diff
grep
if
touch

leider kann ich damit garnix anfangen, evt eine kurze erklärung?

muell200
28.01.11, 11:57
leider kann ich damit garnix anfangen, evt eine kurze erklärung?

frage deine suchmaschine - oder man "befehl"

sorry - oder soll ich das script fuer dich schreiben?

xJAMESx
28.01.11, 12:03
frage deine suchmaschine - oder man "befehl"

sorry - oder soll ich das script fuer dich schreiben?


wenn du so nett bist und es für mich schreiben würdest, dann könnte ich mich auch einlesen damit ich dei struktur usw auch verstehe

buzz768
28.01.11, 12:38
2 text daten vergleicht ob die emails in beiden vorkommen
Versteht ich nicht. Enthalten die Dateien jeweils eine Liste von E-Mail-Adressen (eine pro Zeile?) oder wirklich mehrere ganze E-Mails mit Header und allem untereinander?

xJAMESx
28.01.11, 12:39
also, eine datei enthält nur emails, eine pro zeile

die andere datei enthält die anfragen der server, wo in der zeile eine email steht aber halt irgentwo in der zeile

buzz768
28.01.11, 12:57
Ich gehe jetzt mal davon aus du meinst E-Mail-Adressen.


cat adressen.txt | while read addr ; do grep -q -o $addr server.log && echo $addr >> drin.txt || echo $addr >> nicht_drin.txt ; done

xJAMESx
28.01.11, 13:03
also mein script sieht so aus, wenn ich es ausführe, passiert nix



#!/bin/bash
#Programm testscript.sh

cat emails.txt | while read addr ; do grep -q -o $addr mail.log.4 && echo $addr >> drin.txt || echo $addr >> nicht_drin.txt ; done

buzz768
28.01.11, 13:05
Und die Dateien drin.txt und nicht_drin.txt sind leer?

xJAMESx
28.01.11, 13:06
ja die sind komplett leer

buzz768
28.01.11, 13:09
Tja, dann müsstest du die beiden Dateien emails.txt und mail.log.4 hier mal auszugsweise posten. Adressen und dergleichen kannst du ja abändern.

xJAMESx
28.01.11, 13:18
die beiden daten sind beide ca 25mb groß ich poste mal einen kleinen teil davon:

Emails:



xxx@xxx.de
xx12@xx234.de
usw...


und der log:


Jan 20 06:35:27 ro11638 couriertcpd: Connection, ip=[::ffff:xx.xx.xx.xx]
Jan 20 06:35:27 ro11638 couriertcpd: LOGIN, user=petra.mail@ityx.de, ip=[::ffff:xx.xx.xxx.xxx], protocol=IMAP
Jan 20 06:35:28 ro11638 couriertcpd: Connection, ip=[::ffff:xx.xx.xx.xx]
Jan 20 06:35:28 ro11638 couriertcpd: LOGIN FAILED, user=test@ityx.de, ip=[::ffff:xx.xx.xxx.xxx]
Jan 20 06:35:33 ro11638 couriertcpd: LOGOUT, ip=[::ffff:xx.xx.xxx.xxx], rcvd=70, sent=458
Jan 20 06:35:33 ro11638 couriertcpd: LOGOUT, user=test@ityx.de, ip=[::ffff:xx.xx.xxx.xxx], headers=0, body=0, rcvd=85, sent=693, time=6, starttls=1
Jan 20 06:35:44 ro11638 postfix/smtpd[14171]: warning: xx.xxx.xx.x: address not listed for hostname localhost
Jan 20 06:35:44 ro11638 postfix/smtpd[14171]: connect from unknown[xx.xx.xxx.xxx]
Jan 20 06:35:46 ro11638 postfix/smtpd[14171]: NOQUEUE: reject: RCPT from unknown[xx.xx.xxx.xxx]: 554 5.7.1 <localhost>: Helo command rejected: youre not me; from=<error@mailfrom.com> to=<test@ityx.de> proto=ESMTP helo=<localhost>
Jan 20 06:35:46 ro11638 postfix/smtpd[14171]: NOQUEUE: reject: RCPT from unknown[xx.xx.xxx.xxx]: 554 5.7.1 <localhost>: Helo command rejected: youre not me; from=<error@mailfrom.com> to=<test@ityx.de> proto=ESMTP helo=<localhost>
Jan 20 06:35:46 ro11638 postfix/smtpd[14171]: NOQUEUE: reject: RCPT from unknown[xx.xx.xxx.xxx]: 554 5.7.1 <localhost>: Helo command rejected: youre not me; from=<error@mailfrom.com> to=<test@ityx.de> proto=ESMTP helo=<localhost>
Jan 20 06:35:46 ro11638 postfix/smtpd[14171]: NOQUEUE: reject: RCPT from unknown[xx.xx.xxx.xxx]: 554 5.7.1 <localhost>: Helo command rejected: youre not me; from=<error@mailfrom.com> to=<test@ityx.de> proto=ESMTP helo=<localhost>
Jan 20 06:35:46 ro11638 postfix/smtpd[14171]: NOQUEUE: reject: RCPT from unknown[xx.xx.xxx.xxx]: 554 5.7.1 <localhost>: Helo command rejected: youre not me; from=<error@mailfrom.com> to=<test@ityx.de> proto=ESMTP helo=<local


das komische ist, das er wenn ich das script ausführe überhauptnichts macht der rechner also keine aktivitäten

ich will halt das das script in emails.txt schaut welche emails drin sind, und dann die emails alle mit der mails.log.4 datei vergleicht ob die aderdde irgentwie in der mail.log.4 vorkommt, falls ja dann in drin.txt postet falls nicht in nicht_drin.txt postet

buzz768
28.01.11, 13:32
Also bei mir funktioniert das so, beide Adressen aus emails.txt landen in nicht_drin.txt.

xJAMESx
28.01.11, 13:33
mhh, kannst du mir mal dein script schicken also hier posten? danke

habe das scirpt und alle daten in einem ordner
wenn ich das scirpt ausführe passiert nichts, ich führe es so aus:

./testscript.sh

buzz768
28.01.11, 13:37
Ich habe dein Script ausgeführt. Muss jetzt weg.

xJAMESx
28.01.11, 13:39
mhh komisch das es bei mir nicht funktioniert
er schjreibt rein garnichts rein

xJAMESx
28.01.11, 14:32
weiß keiner wieso das script so nicht funktioniert?


ok, es währe eig auch möglich, alle email acressen aus der log datei auszulesen, dann könnte man beide datein ebsser vergleichen

xJAMESx
28.01.11, 15:33
#!/bin/bash

cat /daten/emails.txt | while
read line
do

echo "Ausgabe: $line" >> Emails_Auslesen.txt
done


damit speichert der schonmal zele für zeile die die emails,
kann ich nicht den log genauso auslesen, ABER mit grep ALLE email adressen greppen?

buzz768
28.01.11, 15:56
grep -o -E "[A-Za-z0-9_\-\+\.]+@[A-Za-z0-9_\-\+\.]+" mail.log.4 | sort| uniq

wobei ich wahrscheinlich nicht alle in E-Mail-Adressen erlaubte Zeichen berücksichtigt habe. Eine passende Regular Expression lässt sich aber gewiss auch per Internet-Suchmaschine finden.

Dodobo.reloaded
28.01.11, 16:27
Also ich danke euch auch mal für die beiden Beispiele, da ich recht wenig code und so wieder ein paar Beispiele kennengelernt habe, die ich auch nach 2-3 mal lesen + "man" verstehe. Wen es auch interessiert, der sollte sich mehr auf Seiten mit solchen Schnippseln rumtreiben, etwa http://www.commandlinefu.com. Tab seit Wochen zum Ansehen offen.

oziris
28.01.11, 19:31
Bitte baue Testausgaben in Dein Script ein, z.B. so eine Zeile am Anfang "echo START;" und so eine am Ende "echo ENDE$?;". Zumindest diese müsstest Du dann beim ausführen des Scriptes sehen. Wenn nicht, gibt es ein grundlegendes Problem.

Du kannst übrigens fast alles nötige in den man-Pages nachlesen, z.B. mit dem Befehl "man bash" findest Du alles, was die bash-Shell so kann. Mit "man diff" alles, was diff so kann usw..
Was allerdings nicht dort steht, sind folgende Grundlagen:
Damit ein Shell-Script ohne Angabe des Interpreters startet (so wäre es z.B. mit Interpreter "bash meinscript"), muss man:
1. In der ersten Zeile den Interpreter etwa so angeben "#! /bin/bash"
2. Das Script muss die Rechte zum Ausführen gesetzt haben, z.B. mit "chmod ug+rx meinscript", siehe "man chmod"
3. Optional kann man das Script nach /usr/local/bin/ tun und (falls noch nicht geschehen) dieses Verzeichnis über die Startdateien seiner Shell in die PATH-Variable tun. Dann kann man es nämlich ausführen, ohne einen Pfad dazu anzugeben (z.B. "./meinscript" oder "/home/james/meinscript").

Dodobo.reloaded
29.01.11, 09:43
Man kann auch ein Verzeichnis bin im eigenen Home anlegen. Dürfte sogar schon im Path drin sein, wenn man Glück hat.