View previous topic :: View next topic |
Author |
Message |
igno2k n00b
Joined: 13 Mar 2004 Posts: 29
|
Posted: Sat Jul 29, 2006 3:02 pm Post subject: Textdatei auslesen und in MySQL DB einfügen? |
|
|
Hallo zusammen,
habe ein kleines Problemchen. Und zwar habe ich hier eine Username / PW Datei vor mir liegen, die in eine MySQL DB eingefügt werden soll.
Das ganze soll wenn möglich per Bash Script geschehen. Nur leider bin ich in Sachen Bash Scripting noch nicht so auf der Höhe.
Hier erstmal ein Auszug aus der Textdatei:
Code: |
==================================================
Index : 1
Protocol : POP3
User : hans
Password : hanshans
==================================================
==================================================
Index : 2
Protocol : POP3
User : pmustermann
Password : =8932ldo.
==================================================
|
Einige Informationen wie z.B. Index und Protocol sind unwichtig; andere unwichtige Werte habe ich der Übersicht wegen weggelassen. Nur User & Password sollen ausgelesen werden und in eine DB geschrieben werden. Denkbar wäre auch das Einfügen in eine andere Datei mitsamt der MySQL Abfragen, so dass es später direkt in der MySQL Shell bzw. per phpMyAdmin in eine DB eingefügt werden kann.
Vielleicht kann mir ja jemand auf die Sprünge helfen, wie ich solch eine Datei richtig auslesen kann.
Vielen Dank
igno |
|
Back to top |
|
|
flash49 Apprentice
Joined: 12 Feb 2005 Posts: 233
|
Posted: Sat Jul 29, 2006 4:24 pm Post subject: |
|
|
Ich hab mal ein kleines awk Programm geschrieben, was dir den File in einen CVS-File (durch Komma getrennte Daten) umwandelt, die du in phpmyadmin verwenden können solltest. Aufgerufen wird das ganze mit "awk -f programm.awk daten.txt"
programm.awk: Code: | BEGIN { RS = "=+" ; FS = "\n" ;RS = "" ; FS = "\n" }
{
match ($4 ,/(User.*)\:[[:space:]]*([[:alnum:]_]+)[[:space:]]*/,arr)
match ($5 ,/(Password.*)\:[[:space:]]*(.*)[[:space:]]*/,arr2)
OFS = ""
print "'",arr[2],"','",arr2[2],"'"
}
END{ RS = "" ; FS = "\n" ; RS = "=*" ; FS = "\n" }
|
Quote: | ~ $ awk -f programm.awk daten.txt
'hans','hanshans'
'pmustermann','=8932ldo.' |
|
|
Back to top |
|
|
igno2k n00b
Joined: 13 Mar 2004 Posts: 29
|
Posted: Sat Jul 29, 2006 4:59 pm Post subject: |
|
|
Super Danke!
Leider gibt mir das Programm bei dem genannten Beispieldatensatz nur Folgendes aus:
Code: |
awk -f test.awk test
'hans','hanshans'
|
Die Datei "test" wird auch nicht verändert - somit leider keine CSV Datei.
Mit der Original Datei bekomme ich folgendes Ergebnis:
Code: |
awk -f test.awk pws.txt
'',''
'',''
'',''
'',''
'',''
'',''
'',''
'',''
|
Die Zeichenfolge "," entspricht in etwa der Anzahl der Datensätze in der Datei pws.txt. Datei pws.txt wird auch nicht verändert.
Zur Übersicht habe ich hier noch einmal einen kompletten Datensatz:
Code: |
==================================================
Index : 1
Protocol : POP3
Local Address : 67.80.92.45
Remote Address : 128.8.45.4
Local Port : 17019
Remote Port : 110
User : dsfdsfd21
Password : ysfdsf22
Capture Time : 28.07.06 17:03:38
==================================================
|
Der Ansatz scheint schon wirklich gut zu sein. Evtl. fällt dir ja ein, woran es liegen könnte.
Ich werde mich mal ein bisschen mit awk beschäftigen - evtl. schaff ichs ja auch selbst
Gruß
igno |
|
Back to top |
|
|
think4urs11 Bodhisattva
Joined: 25 Jun 2003 Posts: 6659 Location: above the cloud
|
Posted: Sat Jul 29, 2006 6:14 pm Post subject: |
|
|
Falls jemand mal ein abschreckendes Beispiel braucht, das ganze geht auch mit sed
Code: | ich@pc ~$ sed -f ./extrakt ./rohdaten
"hans","hanshans"
"pmustermann","=8932ldo."
"dsfdsfd21","ysfdsf22"
ich@pc ~$ |
./extrakt: | :loop
$!{
N
/^User.*\nPassword.*$/{
s/\nPassword/,/
b loop
}
s/\(User.*: \)\(.*\)/\"\2\",/
s/\n\(Password.*: \)\(.*$\)/\"\2\"/
/^\"/P
D
}
/^=====/D |
./rohdaten: | ==================================================
Index : 1
Protocol : POP3
User : hans
Password : hanshans
==================================================
==================================================
Index : 2
Protocol : POP3
User : pmustermann
Password : =8932ldo.
==================================================
==================================================
Index : 1
Protocol : POP3
Local Address : 67.80.92.45
Remote Address : 128.8.45.4
Local Port : 17019
Remote Port : 110
User : dsfdsfd21
Password : ysfdsf22
Capture Time : 28.07.06 17:03:38
==================================================
|
Viel Spaß beim Entschlüsseln der sed statements
HTH
T. _________________ Nothing is secure / Security is always a trade-off with usability / Do not assume anything / Trust no-one, nothing / Paranoia is your friend / Think for yourself |
|
Back to top |
|
|
flash49 Apprentice
Joined: 12 Feb 2005 Posts: 233
|
Posted: Sat Jul 29, 2006 6:38 pm Post subject: |
|
|
igno2k wrote: | Super Danke!
Leider gibt mir das Programm bei dem genannten Beispieldatensatz nur Folgendes aus:
Code: |
awk -f test.awk test
'hans','hanshans'
|
|
Wenn es nur EIN Datensatz ist, dann sollte er auch genau das ausgeben. Wenn die Ausgabe stimmt leitest du die einfach in eine Datei um Code: | awk -f test.awk eingabe > ausgabe |
igno2k wrote: |
Mit der Original Datei bekomme ich folgendes Ergebnis:
Code: |
awk -f test.awk pws.txt
'',''
'',''
'',''
'',''
'',''
'',''
'',''
'',''
|
Die Zeichenfolge "," entspricht in etwa der Anzahl der Datensätze in der Datei pws.txt. Datei pws.txt wird auch nicht verändert.
Zur Übersicht habe ich hier noch einmal einen kompletten Datensatz:
Code: |
==================================================
Index : 1
Protocol : POP3
Local Address : 67.80.92.45
Remote Address : 128.8.45.4
Local Port : 17019
Remote Port : 110
User : dsfdsfd21
Password : ysfdsf22
Capture Time : 28.07.06 17:03:38
==================================================
|
Der Ansatz scheint schon wirklich gut zu sein. Evtl. fällt dir ja ein, woran es liegen könnte.
| Das Problem ist ziemlich einfach erklärt: Deine Originaldaten enthalten pro Eintrag mehr Zeilen, als dein erstes Beispiel und mein Programm hab ich auf das erste Beispiel abgestimmt. Da waren Username und Passwort in den Zeilen 4 und 5 eines Eintrags, jetzt sind es 8 und 9!
Wenn du das $4 durch $8 und das $5 durch $9 ersetzt sollte es gehen. igno2k wrote: |
Ich werde mich mal ein bisschen mit awk beschäftigen - evtl. schaff ichs ja auch selbst
Gruß | Reguläre Ausdrücke (Das, was bei awk in den beiden "//" drin steht) solltest du dir aber auch ansehen, da das der Trick bei der Sache ist.
Ich habe das Programm noch so verbessert, daß es nur noch 2 Voraussetzungen hat:
1. In einer Zeile steht der Beutzername ($1) und in der Zeile direkt danach steht das Passwort($2)
2. Einen Daten zeile sieht so aus: "Bezeichner : Wert", mit jeweils beliebig vielen Leerzeichen oder TABs dazwischen
Programm funktioniert so nicht richtig, Korrektor siehe unten
Code: | BEGIN { FS = "\n" }
{
matched=match ($1 ,/(User.*)\:[[:space:]]*([[:alnum:]_]+)[[:space:]]*/,arr)
match ($2 ,/(Password.*)\:[[:space:]]*(.*)[[:space:]]*/,arr2)
OFS = ""
if (matched)print "'",arr[2],"','",arr2[2],"'"
}
|
Edit:
@Think4UrS11
Im Prinzip macht dein Programm genau das, was meine 2 Programmversion macht, nur das awk den äußeren loop nicht braucht, da es eh die Datei Zeilenweise durchgeht.
Last edited by flash49 on Sat Jul 29, 2006 7:03 pm; edited 1 time in total |
|
Back to top |
|
|
flash49 Apprentice
Joined: 12 Feb 2005 Posts: 233
|
Posted: Sat Jul 29, 2006 7:00 pm Post subject: |
|
|
In meinem Programm ist noch ein kleiner Denkfehler drin gewesen, das hier sollte funktionieren:
Code: | BEGIN { RS="User[^:]*:" ; FS = "\n" }
{
matched=match ($1 ,/[[:space:]]*([[:alnum:]_]+)[[:space:]]*/,arr)
match ($2 ,/(Password.*)\:[[:space:]]*(.*)[[:space:]]*/,arr2)
OFS = ""
if (matched)print "'",arr[1],"','",arr2[2],"'"
} |
|
|
Back to top |
|
|
slick Bodhisattva
Joined: 20 Apr 2003 Posts: 3495
|
Posted: Sat Jul 29, 2006 8:49 pm Post subject: |
|
|
verschoben nach Diskussionsforum |
|
Back to top |
|
|
igno2k n00b
Joined: 13 Mar 2004 Posts: 29
|
Posted: Sun Jul 30, 2006 8:25 am Post subject: |
|
|
Super Leute!
Beide Programme funktionieren
Ich werde den Code dann noch ein bisschen an meine Bedürfnisse anpassen und mich weiter mit sed und awk beschäftigen, um solche Fragen zu vermeiden
Grüße
igno |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|