mike85
Goto Top

IP Adresse aus TXT auslesen und neue Textdatei zusammenbauen!?

Die Suche nach IP Adressen mit regulärem Ausdruck funktioniert schon.

Fehlt nur noch wie ich den gefundenen Ausdruck in eine neue TXT Datei schreiben kann?!

Guten Tag,

es liegt eine Textdatei in folgendem Format vor:

AP IP hostname 00:07:0e:38:ae:a0 11.02.2010 15:30:00 192.168.0.205

Davon gibt es mehrere Zeilen!

Ich möchte aus jeder Zeile die IP-Adresse extrahieren und in eine neue TXT Datei schreiben, finde aber nicht die richtigen Mittel dazu, oder suche einfach nach dem falschen.

Mit Hilfe dieses Codes: http://www.mcseboard.de/windows-forum-scripting-71/zeile-string-auslese ...

und dem RegExp: "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"

kann ich zumindest schon einmal die Zeilen "greifen" in denen die IP vorhanden ist.
Kann mir jmd. nen Tipp geben wie ich den getroffenen Ausdruck nun abgespeichert bekomme?

Danke für eure Ratschläge!

Content-Key: 135969

Url: https://administrator.de/contentid/135969

Printed on: April 19, 2024 at 05:04 o'clock

Member: micneu
micneu Feb 15, 2010 at 13:24:02 (UTC)
Goto Top
wie soll das ergebnis denn aussehen?
du hast nur geschrieben wie deine ausgangs datei ist.

gruß michael
Member: Edi.Pfisterer
Edi.Pfisterer Feb 15, 2010 at 13:24:19 (UTC)
Goto Top
hallo!
mein Vorschlag in vbs:

file = "ipliste.txt"  
fileneu = "ipneu.txt"  
Set fs = CreateObject("Scripting.FileSystemObject")  


   Set File = fs.OpenTextFile(file , 1, true)
     ' Datei zum Lesen öffnen  


Do While not file.AtEndOfStream
   ipadresse = ipadresse & right(file.ReadLine,13) & vbcrlf
Loop


set objtextstream = fs.createtextfile(fileneu, True)
strwritestring = ipadresse
objtextstream.write strwritestring
objtextstream.close
set objtextstream = nothing
set file = nothing
set fs = nothing

die Variable FILE meint deine txt-Datei.
Achtung: Dieser rudimentäre Code funktioniert nur, wenn Deine IP-Adressen nur 13 Zeichen lang sind (wie in Deinem Beispiel). Ansonsten halt die Zeileipadresse = ..... entsprechend ändern
Solltest Du auch längere Ip-Adressen (oder kürzere) haben, dann bitte hier nochmal posten (oder selber suchen...)
Ich würde mich mit InstrRev an die Sache heranwagen...

hoffe, geholfen zu haben
lg
Member: Edi.Pfisterer
Edi.Pfisterer Feb 15, 2010 at 14:10:35 (UTC)
Goto Top
Hallo!

der Vollständigkeit halber der fertige Code für ALLE Längen von IP-Adressen (der Code sucht nach dem letzten Leerzeichen, ab da muss die IP-Adresse beginnen....)
(Code in VBS, wer mag kann aber auch noch den batch-code posten... eh klar!)

file = "ipliste.txt"  
fileneu = "ipneu.txt"  
Set fs = CreateObject("Scripting.FileSystemObject")  


   Set File = fs.OpenTextFile(file , 1, true)
     ' Datei zum Lesen öffnen  


Do While not file.AtEndOfStream
   zeile = (file.ReadLine)
   Iplaenge = len(zeile)-InstrRev(zeile," ")  

   ipadresse = ipadresse & right(zeile,Iplaenge) &  vbcrlf
Loop


set objtextstream = fs.createtextfile(fileneu, True)
strwritestring = ipadresse
objtextstream.write strwritestring
objtextstream.close
file.close
set objtextstream = nothing
set file = nothing
set fs = nothing

Ergebnis
ipliste.txt:

AP IP hostname 00:07:0e:38:ae:a0 11.02.2010 15:30:00 192.168.34.205
AP IP hostname 00:07:0e:38:ae:a0 11.02.2010 15:30:00 192.168.0.206
AP IP hostname 00:07:0e:38:ae:a0 11.02.2010 15:30:00 192.168.255.207
AP IP hostname 00:07:0e:38:ae:a0 11.02.2010 15:30:00 192.168.0.8
AP IP hostname 00:07:0e:38:ae:a0 11.02.2010 15:30:00 192.168.0.205
AP IP hostname 00:07:0e:38:ae:a0 11.02.2010 15:30:00 192.16.0.206
AP IP hostname 00:07:0e:38:ae:a0 11.02.2010 15:30:00 192.168.0.207
AP IP hostname 00:07:0e:38:ae:a0 11.02.2010 15:30:00 192.18.0.28

ipneu.txt:
192.168.34.205
192.168.0.206
192.168.255.207
192.168.0.8
192.168.0.205
192.16.0.206
192.168.0.207
192.18.0.28


Hoffe, das entpsricht Deinen Anforderungen. Falls dem so ist: bitte Frage als gelöst markieren!
Hoffe, geholfen zu haben und freue mich - wie immer eigentlich - über postives Feedback face-wink
lg
Member: bastla
bastla Feb 15, 2010 at 14:16:22 (UTC)
Goto Top
Hallo Mike85 und willkommen im Forum!

Soferne nicht alle Zeilen eine IP enthalten und daher tatsächlich RegEx benötigt wird, etwa so:
DateiEin = "D:\Liste.txt"  
DateiAus = "D:\IP.txt"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set rE = New RegExp
rE.Global = True
rE.Pattern = "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"  

Set Aus = fso.CreateTextFile(DateiAus, True)
For Each Match In rE.Execute(fso.OpenTextFile(DateiEin).ReadAll)
    Aus.WriteLine Match
Next
Aus.Close
Grüße
bastla
Member: Mike85
Mike85 Feb 15, 2010 at 14:25:50 (UTC)
Goto Top
Ich habe es jetzt soweit hinbekommen durch probieren:

im txt, feld
Set objFSO = CreateObject("Scripting.FileSystemObject")  

txt="AP IP	hostname	00:07:0e:38:ae:a0	11.02.2010 15:30:00	192.168.0.205	"  
txt = Replace(txt,vbTab,";")  
feld = Split(txt, ";")  
Call WriteToLog(strLogFile, feld(4))


Sub WriteToLog(inFile, inText)

Set objFile1 = objFSO.OpenTextFile(inFile, 8, True)
objFile1.WriteLine("AL;"+inText)  
objFile1.Close

End Sub

Jetzt stehe ich aber vor nem größeren Problem!

In der Textdatei stehen noch mehr Informationen wie z.B.: hostname01

AP Name 00:07:0e:38:ae:a0 15.02.2010 14:45:00 hostname01
AP Name 00:0f:24:78:07:70 15.02.2010 14:45:00 hostname02
AP Name 00:0f:24:78:07:a0 15.02.2010 14:45:00 hostname03
AP IP 00:07:0e:38:ae:a0 15.02.2010 14:45:00 192.168.0.1
AP IP 00:0f:24:78:07:70 15.02.2010 14:45:00 192.168.0.2
AP IP 00:0f:24:78:07:a0 15.02.2010 14:45:00 192.168.0.3

Wenn ich die neue Textdatei zusammengebaut habe, soll es danach so aussehen:

192.168.0.1;hostname01

Das heißt nun er soll aus der ersten Zeile sich den "hostname01" holen und aus der 4. Zeile die IP-Adresse.
Das einzigste was gleich ist, ist die MAC Adresse (00:07:0e:38:ae:a0)!

Könnte es vllt damit gehen, dass ich die erste Zeile mit "AP Name" am Anfang suche, dann den Hostnamen extrahiere und danach die erste Zeile mit "AP IP" am Anfang suche und die IP-Adresse rausziehe und die beiden Werte dann in die neue Datei schreibe?

Danke für eure Hilfe!
Member: Edi.Pfisterer
Edi.Pfisterer Feb 15, 2010 at 14:26:16 (UTC)
Goto Top
Hallo bastla!
wie eigentlich stets bisher hab ich mal wieder meinen Meister gefunden face-wink)
Good Job, well done!

lg
Member: bastla
bastla Feb 15, 2010 at 14:42:02 (UTC)
Goto Top
Hallo Mike85!

Da sich offensichlich auch TAB zwischen den einzelnen Feldern befinden, poste bitte Deine Beispieldaten unter -Tags ...

Gibt es nur die beiden beschriebenen Arten von Zeilen? Falls nein: Sind die Zeilen mit den Hostnamen eindeutig anhand des "AP Name" zu erkennen?
@urobe73
Danke für die Blumen - Deine zweite Version hat mir aber auch gefallen ...

Grüße
bastla
Member: Edi.Pfisterer
Edi.Pfisterer Feb 15, 2010 at 14:54:45 (UTC)
Goto Top
hallo Mike85!

hier nun ein Update...

file = "ipliste.txt"  
fileneu = "ipneu.txt"  
dim liste(50,1)
Set fs = CreateObject("Scripting.FileSystemObject")  
set objtextstream = fs.createtextfile(fileneu, True)

   Set File = fs.OpenTextFile(file , 1, true)

i = 0
k = 0
Do While not file.AtEndOfStream
   zeile = (file.ReadLine)
     Iplaenge = len(zeile)-InstrRev(zeile," ")  
  if Instr(zeile,"AP Name")>= 1 then  
  liste(i,0) = right(zeile,Iplaenge)
  i = i+1
  else
    liste(k,1) = right(zeile,Iplaenge)
  K = k+1
  end if
Loop

for i = 0 to ubound(liste)
objtextstream.write liste(i,1) & ";" & liste(i,0) & vbcrlf  
next

Achtung: Das Array wird in Zeile mit 50 Hosts angenommen...
Entweder hat bastla hier einen Verbesserungsvorschlag (Redim wird hier ja nicht funktionieren, oder? kenne mich aber mit Arrays nicht ganz soo aus) oder Du korrigierst den Wert auf Deine Anzahl...

Ansonsten gebe ich bastla recht:
Schön wäre es gewesen, Du hättest gleich einen Auszug Deiner .txt hier gepostet...
Tipp: Verwende den "< code >" Tag (ohne Leerzeichen)

lg
Member: bastla
bastla Feb 15, 2010 at 14:59:44 (UTC)
Goto Top
Hallo Mike85!

Da ich leider gerade nicht mehr Zeit habe, als Grundgerüst (und unter der Annahme, dass sich die Felder anhand von TAB trennen lassen und anhand des ersten Feldes der jeweilige Satz identifiziert werden kann):
DateiEin = "D:\Liste.txt"  
DateiAus = "D:\IPHost.txt"  
Host = "AP Name"  
IP = "AP IP"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set d = CreateObject("Scripting.Dictionary")  

Set Aus = fso.CreateTextFile(DateiAus, True)

T = Split(fso.OpenTextFile(DateiEin).ReadAll, vbCrLf)
For i = 0 To UBound(T)
    F = Split(T(i), vbTab)
    If F(0) = Host Then d.Add F(1), F(4)
Next

For i = 0 To UBound(T)
    F = Split(T(i), vbTab)
    If F(0) = IP Then
        If d.Exists(F(1)) Then
            Aus.WriteLine F(4) & ";" & d.Item(F(1))  
        End If
    End If
Next

Aus.Close
Grüße
bastla
Member: micneu
micneu Feb 15, 2010 at 15:01:59 (UTC)
Goto Top
ich habe es mit "grep" gelöst:

grep -o -E "([0-9]*.\.[0-9]*.\.[0-9]*.\.[0-9]*.)" ip-test.txt > test.txt  

gruß michael
Member: bastla
bastla Feb 15, 2010 at 15:02:22 (UTC)
Goto Top
@urobe73

Du kannst "ReDim Preserve" verwenden, allerdings neige ich eher zum Einlesen am Stück und "Split" bei den Zeilenschaltungen ...

Grüße
bastla
Member: Edi.Pfisterer
Edi.Pfisterer Feb 15, 2010 at 15:15:36 (UTC)
Goto Top
Servus bastla!
Tja, auf "split" hätte ich auch kommen können....
Wäre bei mir trotzdem nicht so schön ausgefallen...
Respekt!

Danke für den Tipp mit Redim Preserve. Habe allerdings wenig ergoogelt, das dafür gesprochen hätte...
habe mich also für ein Workaround entschieden....

@mike

Ersetze bitte die Schleife am Ende meines codes gegen

for i = 0 to ubound(liste)
zeile = liste(i,1) & ";" & liste(i,0) & vbcrlf  
if len(zeile)>= 5 then objtextstream.write zeile
next

Dann verschwinden diese überflüssigen ";"

btw: Der Code von bastla ist selbstverstänlich deutlich sexyer...
Da dieser bei mir leider nicht funktionierte (hab den fehler nicht gesucht...) und falls Du - so wie ich - auch mit quick und dirty zufrieden bist, die 2.beste-Lösung face-wink

Und: dieser Code gibt nur Sinn für Dich, wenn Deine Ausgangsdatei wirklich zuerst die Namen und dann in der selben Reihenfolge die Adressen gespeichert hat. Einen Abgleich der MAC nehme ich nicht vor...
lg
Member: Mike85
Mike85 Feb 15, 2010 at 15:33:06 (UTC)
Goto Top
Servus Leute, ich hab grad ne eigene Lösung auf die Beine gestellt, weiß nur nicht wie effektiv die ganze Geschichte ist und ob der von euch gepostete Code nicht effektiver wäre...:

strLogFile = "fehlerobjekte.txt"    
Dim txt, feld, feld2

Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objFile = objFSO.OpenTextFile("test.txt", 1)  


Do Until objFile.AtEndOfStream
    strLine = objFile.ReadLine
        If instr(strLine, "AP Name") > 0 Then  
            strLine = Replace(strLine,vbTab,";")  

            feld = Split(strLine, ";")  
             Wscript.Echo feld(4)
                
                Set objFile2 = objFSO.OpenTextFile("test.txt", 1)  
                Do Until objFile2.AtEndOfStream
                    zweiteLine = objFile2.ReadLine
                        If instr(zweiteLine, "AP IP") > 0 Then  
                            
                            If instr(zweiteLine, feld(2)) > 0 Then
                                zweiteLine = Replace(zweiteLine,vbTab,";")  
                                feld2 = Split(zweiteLine, ";")  
                                Wscript.Echo feld2(4)
                                
                            End if
                        End if
                Loop

            Call WriteToLog(strLogFile, feld(4), feld2(4))
        End if
Loop

Sub WriteToLog(inFile, inHostname, inIP)

Set objFile1 = objFSO.OpenTextFile(inFile, 8, True)
objFile1.WriteLine(inHostname+";"+inIP+";")  
objFile1.Close

End Sub
Member: bastla
bastla Feb 15, 2010 at 16:29:13 (UTC)
Goto Top
Hallo Mike85!

Nur als Anmerkung: Splitten kannst Du auch anhand des Trennzeichens "TAB" - das "Replace" ist nicht nötig ...
Für das Testen meines Ansatzes hatte ich übrigens folgende Daten verwendet:
AP Name	00:07:0e:38:ae:a0	15.02.2010	14:45:00	hostname01
AP Name	00:0f:24:78:07:70	15.02.2010	14:45:00	hostname02
AP Name	00:0f:24:78:07:a0	15.02.2010	14:45:00	hostname03
AP IP	00:07:0e:38:ae:a0	15.02.2010	14:45:00	192.168.0.1
AP IP	00:0f:24:78:07:70	15.02.2010	14:45:00	192.168.0.2
AP IP	00:0f:24:78:07:a0	15.02.2010	14:45:00	192.168.0.3
Abhängig von den tatsächlichen TAB-Positionen sind ggf die Felder (zB F(1) für die MAC-Adresse) anzupassen ...

Grüße
bastla
Member: Mike85
Mike85 Feb 15, 2010 at 17:35:42 (UTC)
Goto Top
Ich glaub das Problem liegt darin, dass ich die Daten aus einem anderen Prozess rausgespuckt bekomme, deshalb weiß ich nicht ob es nun ein TAB oder einfach nur ein " ".
Aber mit der Replace und Split Methode klappts auf jeden Fall.
Member: bastla
bastla Feb 15, 2010 at 17:42:22 (UTC)
Goto Top
Hallo Mike85!

Wenn Du vor dem Replace keine ";" in der Zeile hattest, danach aber schon (sonst würde das Splitten nicht funktionieren), kann ja nur jeweils ein TAB ersetzt worden sein ...

Was ich eigentlich meinte: Du könntest gleich
feld = Split(strLine, vbTab)
verwenden.

Grüße
bastla

P.S.: Mit einem vernünftigen Editor (oder zur Not auch mit zB Word) kannst Du Dir ja Steuerzeichen anzeigen lassen - dann weißt Du ganz genau, ob TAB oder " ".
Member: Biber
Biber Feb 15, 2010 at 17:47:06 (UTC)
Goto Top
[OT] Moin bastla,
Zitat von @bastla:
P.S.: Mit einem vernünftigen Editor
oder einer vernünftigen Editorin...

Immer schön gender-konform bleiben... face-wink

Grüße
Biber
[/OT]
Member: bastla
bastla Feb 15, 2010 at 17:51:22 (UTC)
Goto Top
[OT]
Hallo Biber!
....oder einer vernünftigen Editorin...
Würdest Du auch Editeuse gelten lassen? face-wink

Grüße
bastla
[/OT]
Member: Biber
Biber Feb 15, 2010 at 17:55:26 (UTC)
Goto Top
[OT ii]
Zitat von @bastla:
Würdest Du auch Editeuse gelten lassen? face-wink
Auch Editörin ... oder Editesse... ...Hauptsache rothaarig...

Und ihre TABs muss sie zeigen..

*~~ 50c in die Chauvikasse schnipp ~~*

Grüße
Biber
[/OT ii]
Member: mrtux
mrtux Feb 15, 2010 at 18:00:45 (UTC)
Goto Top
Hi!

Zitat von @Biber:
Auch Editörin ... oder Editesse... ...Hauptsache rothaarig...

Oder Edith's Tine...aber ob die wirklich rothaarig ist, muss ich erst mal genau erschauen, sehe sie momentan eher selten. face-smile

Und ihre TABs muss sie zeigen..

Solange die TABs keine Leerzeichen sind ;-P bin ja schon ruhig...

mrtux
Member: Mike85
Mike85 Feb 15, 2010 at 18:31:59 (UTC)
Goto Top
Danke für den Tipp!

Doppelt gemoppelt muss wirklich nicht sein, teste ich morgen einfach mal aus!

Aber Hauptsache das Script bringt das gewünschte Ergebnis!

Vor allem mal einen dicken Applaus für all die netten Leute hier, die sich meinem Problem angenommen und bemüht haben, auch wenn ich es im Endeffekt selbst hinbekommen habe!

Falls es noch Fragen gibt, melde ich mich.