Findstr schreibt nur den Zeilenanfang bis Leerzeichen. Zu suchende Zeichenkette korrekt.
Was ist denn unter einem "persönlichem" Vorwort zu verstehen? Soll ich meine Computervorgeschichte hier reinschreiben? Schreiben wer ich bin und was ich tuhe? Mich vorstellen, eben? Ich schreibe hier kein Buch. Das ist eine einfache Frage. Wozu werde ich genötigt ein Vorwort zu verfassen?
Das ist nicht von belang. Wo ist da der Sinn?
Naja,
zu meinem Problem:
Ich wollte, um mir die Arbeit zu vereinfachen, nicht jede IP eines kopierten Textes einzeln rauskopieren, sondern "findstr" die Anweisung geben, dieses zu tun. Manchmal sind es mehr als 60 IPs und da ist mir der Aufwand zu groß.
Die IPs stehen nicht am Zeilenanfang. Das hängt mit Seite zusammen von der ich sie kopiere.
Das sieht dann in etwa so aus:
12/16 62.104.179.121:27015 [Launch] surf_ski_2 8029 14917 5 417 33m37s 176km (109mi) Hamburg, 04 95.03% 0
Ich habe mit folgendem Code probleme die IP rauszukopieren:
del "C:\Dokumente und Einstellungen\xxx\Desktop\ips.txt"
for /f %%i in ('findstr /C ".*\..*\..*\..*:....." "C:\Dokumente und Einstellungen\xxx\Desktop\ipliste.txt"') do ECHO %%i >>"C:\Dokumente und Einstellungen\xxx\Desktop\ips.txt"
Pause
Ausgabe in der ips.txt:
12/16
Wenn ich per Hand die Angabe: 12/16 entferne schreibt er mir die IP rein. Aber dann könnte ich mir das auch sparen.
Warum hängt er sich also daran auf?
Ich hab es auch schon mit /R, /L, usw versucht, aber das bringt nichts.
Bitte um Hilfe.
MfG
Das ist nicht von belang. Wo ist da der Sinn?
Naja,
zu meinem Problem:
Ich wollte, um mir die Arbeit zu vereinfachen, nicht jede IP eines kopierten Textes einzeln rauskopieren, sondern "findstr" die Anweisung geben, dieses zu tun. Manchmal sind es mehr als 60 IPs und da ist mir der Aufwand zu groß.
Die IPs stehen nicht am Zeilenanfang. Das hängt mit Seite zusammen von der ich sie kopiere.
Das sieht dann in etwa so aus:
12/16 62.104.179.121:27015 [Launch] surf_ski_2 8029 14917 5 417 33m37s 176km (109mi) Hamburg, 04 95.03% 0
Ich habe mit folgendem Code probleme die IP rauszukopieren:
del "C:\Dokumente und Einstellungen\xxx\Desktop\ips.txt"
for /f %%i in ('findstr /C ".*\..*\..*\..*:....." "C:\Dokumente und Einstellungen\xxx\Desktop\ipliste.txt"') do ECHO %%i >>"C:\Dokumente und Einstellungen\xxx\Desktop\ips.txt"
Pause
Ausgabe in der ips.txt:
12/16
Wenn ich per Hand die Angabe: 12/16 entferne schreibt er mir die IP rein. Aber dann könnte ich mir das auch sparen.
Warum hängt er sich also daran auf?
Ich hab es auch schon mit /R, /L, usw versucht, aber das bringt nichts.
Bitte um Hilfe.
MfG
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 134221
Url: https://administrator.de/forum/findstr-schreibt-nur-den-zeilenanfang-bis-leerzeichen-zu-suchende-zeichenkette-korrekt-134221.html
Ausgedruckt am: 26.12.2024 um 12:12 Uhr
19 Kommentare
Neuester Kommentar
Hallo Smiley!
"
Zerlegt wird dann mittels "
Grüße
bastla
P.S.: Falls "
"
findstr
" arbeitet zeilenorientiert - insofern erhältst Du immer zum Suchbegriff passende ganze Zeilen.Zerlegt wird dann mittels "
for /f
" anhand von Trennzeichen ("Delimitern") - wenn Du also nur die IP-Adresse (ohne Portangabe) benötigst, wären die passenden Trennzeichen das Leerzeichen (nach "12/16") und der Doppelpunkt (vor dem Port) und der gesuchte Teil ("Token") hat die laufende Nummer 2:for /f "tokens=2 delims=: " %%i ...
bastla
P.S.: Falls "
findstr
" überhaupt nötig sein sollte (weil nicht in jeder Zeile eine Adresse steht), wäre "/C" durch "/R" zu ersetzen (bzw ersatzlos zu entfernen) ...
Hallo Smiley!
Wenn Du den Port auch behalten willst, wird das Trenzeichen ":" nicht benötigt - dann genügt das (defaultmäßige) Leerzeichen:
Davon willst Du nur die Nr. 2 ...
Grüße
bastla
Ich dachte "findstr" gibt mir das gefundene aus
Macht es auch - allerdings immer die komplette Zeile - was Du ja leicht testen kannst, indem Du es ohne "for
" verwendest, also:findstr ".*\..*\..*\..*:....." "C:\Dokumente und Einstellungen\xxx\Desktop\ipliste.txt"
Also trennt er doch beim Leerzeichen.
Nur, wenn keine Trennzeichen angegeben sind oder (wie in meinem Ansatz) das Leerzeichen explizit in den "Satz" aufgenommen wird.Wenn Du den Port auch behalten willst, wird das Trenzeichen ":" nicht benötigt - dann genügt das (defaultmäßige) Leerzeichen:
for /f "tokens=2" %%i ...
Wieso brauche ich überhaupt Token?
Die "Tokens" sind die Ergebnisse der Trennung - aus Deinem Beispiel entstehen bei Trennung anhand der Leerzeichen :Token-Nr | Inhalt |
---|---|
1 | 12/16 |
2 | 62.104.179.121:27015 |
3 | [Launch] |
4 | surf_ski_2 |
5 ... | 8029 14917 5 417 33m37s 176km (109mi) Hamburg, 04 95.03% 0 |
Grüße
bastla
Moin Smiley,
Muss an deinem Sonnenscheinchen-Nick liegen.
Zur Ehrenrettung der Redmonder Skiddies muss ich aber jetzt einwerfen
Angenommen, wir hätten irgendwo die eine Zeile aus deinem Beispiel griffbereit in einer Variable %oneLine%:
... nur, damit ich es vorturnen kann am CMD-Prompt natürlich; das erste ">" nicht mit eingeben, is' sich mein Prompt:
Diese CMD-Oneliner fieselt aus der ganzen Zeile das "Token" raus, das den Doppelpunkt [zwischen IP und Port] enthält und macht damit irgendwas, hier dargestellt durch das Anzeigen von [SET "theIP=%i"]
Geht also schon alles relativ stressarm... das Werkzeug CMD sieht nur so klobig aus....
Grüße
Biber
Ich verstehe nicht warum es nicht eine einfache Methode dafür gibt...
bin doch bestimmt nicht der einzige der eine Liste von IPs benötigt, die er wo anders rauskopiert hat.
"Nomen est omen", wie die alten Griechen sagten.... ich finde das toll, dass du trotz Montag so entspannt und flauschig bleibst.bin doch bestimmt nicht der einzige der eine Liste von IPs benötigt, die er wo anders rauskopiert hat.
Muss an deinem Sonnenscheinchen-Nick liegen.
Zur Ehrenrettung der Redmonder Skiddies muss ich aber jetzt einwerfen
- erstens könnte der FindStr-befehl auch durchaus mit Regular Expressions hantieren... und wenn halt (formal betrachtet) zwei "Satzarten" in dieser IP-Liste vorkommen können (mal mit einer zweiten Spalte "(n)" und einer dritten Spalte "Ip:Port" und mal "Sätze" mit dem IP:port-Wert in der zweiten Spalte... ließe sich auch über Findstr trennen und dann halt die IP aus Spalte 2 oder Spalte 3 holen.
- zweitens ist es aber mit zwei FOR-Anweisungen hintereinander schneller gemacht als ein Nachschlagen der RegExp-Syntax am CMD-Prompt dauert.
Angenommen, wir hätten irgendwo die eine Zeile aus deinem Beispiel griffbereit in einer Variable %oneLine%:
SET "oneLine=0/32 (1) 87.106.84.31:27038 [Launch] deathrun_insane 2972 5460 182 202 612s 160km (99mi) , 89.94% 0"
... nur, damit ich es vorturnen kann am CMD-Prompt natürlich; das erste ">" nicht mit eingeben, is' sich mein Prompt:
>FOR /F "tokens=*" %z in ("%oneline%") do @FOR %i in (%z) do @echo %i|find ":" && @echo set "theIp=%i"
set "theIp=87.106.84.31:27038"
Geht also schon alles relativ stressarm... das Werkzeug CMD sieht nur so klobig aus....
Grüße
Biber
...und wenn womöglich später in der Zeile noch ein Doppelpunkt vorhanden wäre, kannst Du mit (diesmal wieder Batch-Schreibweise)
dafür sorgen, dass das erste Vorkommen verwendet wird.
Grüße
bastla
set "theIP="
FOR /F "tokens=*" %%z in ("%oneline%") do @FOR %%i in (%%z) do @echo %%i|find ":" && if not defined theIp set "theIp=%%i"
Grüße
bastla
Hallo Smiley!
reduzieren ...
Grüße
bastla
Es sei denn, du weist wie man es schneller hinbekommt. ?
Etwa, indem das "findstr
" vermieden wird - brauchst Du das tatsächlich? Wenn jede Zeile eine Adresse enthielte, ließe sich das Ganze schon mal auf@echo off & setlocal
set "Ein=C:\Dokumente und Einstellungen\xxx\Desktop\ipliste.txt"
set "Aus=C:\Dokumente und Einstellungen\xxx\Desktop\ips.txt"
del "%Aus%" 2>nul
FOR /F "usebackq tokens=*" %%z in ("%Ein%") do FOR %%i in (%%z) do echo %%i|find ":" && ECHO %%i >>"%Aus%"
Grüße
bastla
Hallo Smiley!
Wenn's wirklich flott sein soll, hast Du mit Batch denn doch nicht unbedingt die besten Voraussetzungen - versuch's mal mit VBS:
Grüße
bastla
Wenn's wirklich flott sein soll, hast Du mit Batch denn doch nicht unbedingt die besten Voraussetzungen - versuch's mal mit VBS:
EinDatei = "C:\Dokumente und Einstellungen\xxx\Desktop\ipliste.txt"
AusDatei = "C:\Dokumente und Einstellungen\xxx\Desktop\ips.txt"
Set rE = New RegExp
rE.Global = True
rE.Pattern = " \d+\.\d+\.\d+\.\d+\:\d+ "
Set fso = CreateObject("Scripting.FileSystemObject")
T = fso.OpenTextFile(EinDatei).ReadAll
Set Aus = fso.CreateTextFile(AusDatei)
For Each Result In rE.Execute(T)
Aus.WriteLine Trim(Result.Value)
Next
Aus.Close
bastla
@bastla
[OT]
Guck doch mal kurz nach ganz oben in den Eröffnungsbeitrag
Da steht:
Ja hey! Dann lass den Quatsch doch eine gefühlte Sekunde pro Zeile dauern. So what?
Er muss doch bei einem Batch nicht die Tastatur festhalten, bis die letzte Zeile durchgenudelt ist...
Oder hast du da ein "Bitte warten..." -Fenster eingebaut, dass ihn in seinen Bann zieht?
Ich glaube, das ist das, was unsere Vizekanzlerin immer als Jammern auf hohem Niveau bezeichnet....
Grüße
Biber
[/OT]
[OT]
Guck doch mal kurz nach ganz oben in den Eröffnungsbeitrag
Da steht:
...Manchmal sind es mehr als 60 IPs und da ist mir der Aufwand zu groß.
Ja hey! Dann lass den Quatsch doch eine gefühlte Sekunde pro Zeile dauern. So what?
Er muss doch bei einem Batch nicht die Tastatur festhalten, bis die letzte Zeile durchgenudelt ist...
Oder hast du da ein "Bitte warten..." -Fenster eingebaut, dass ihn in seinen Bann zieht?
Ich glaube, das ist das, was unsere Vizekanzlerin immer als Jammern auf hohem Niveau bezeichnet....
Grüße
Biber
[/OT]
[OT]
@Biber
"Mehr als 60" bedeutet doch: nach oben offen
Die 2 Minuten mehr (im Vergleich zu einer auf das Mengengerüst Bezug nehmenden Antwort - die es aber fast ohnehin geworden wäre) für das Script hatte ich dann auch noch - und außerdem: Wir wollen hier doch über den Anlassfall hinausdenken und zukünftigen Generationen etwas hinterlassen ...
Grüße
bastla
[/OT]
@Biber
"Mehr als 60" bedeutet doch: nach oben offen
Die 2 Minuten mehr (im Vergleich zu einer auf das Mengengerüst Bezug nehmenden Antwort - die es aber fast ohnehin geworden wäre) für das Script hatte ich dann auch noch - und außerdem: Wir wollen hier doch über den Anlassfall hinausdenken und zukünftigen Generationen etwas hinterlassen ...
Grüße
bastla
[/OT]
[nochmal OT]
@bastla
Oh nein... keine sinnentstellenden Zitate bitte: "Manchmal sind es mehr als 60 IPs...", nicht im Durchschnitt.
und zusätzlich kann es auch sein, dass es ihm nur wie 60 IPs vorkam... so wie vorhin die eine 1 Sekunde pro "Find"-Aufruf..*gg
Wahrscheinlich liefen nebenbei zwei DVD-vom-Netz-auf-Brenner-Schaufel-Aufgaben...
Für die Abarbeitung dieser 60 verträumten IP-Zeilen von einem Game-Server haben ein paar unbezahlbar gute Skript-Virtuosen genauso viele Skript-Zeilen aus der Tastatur geschüttelt... Ob das volkswirtschaftlich vertretbar ist...?
Grüße zurück
Biber
[/ nochmal OT]
@bastla
Oh nein... keine sinnentstellenden Zitate bitte: "Manchmal sind es mehr als 60 IPs...", nicht im Durchschnitt.
und zusätzlich kann es auch sein, dass es ihm nur wie 60 IPs vorkam... so wie vorhin die eine 1 Sekunde pro "Find"-Aufruf..*gg
Wahrscheinlich liefen nebenbei zwei DVD-vom-Netz-auf-Brenner-Schaufel-Aufgaben...
Die 2 Minuten mehr (im Vergleich zu einer auf das Mengengerüst Bezug nehmenden Antwort - die es aber fast ohnehin geworden wäre) für das Script
Na ja... andererseits....Für die Abarbeitung dieser 60 verträumten IP-Zeilen von einem Game-Server haben ein paar unbezahlbar gute Skript-Virtuosen genauso viele Skript-Zeilen aus der Tastatur geschüttelt... Ob das volkswirtschaftlich vertretbar ist...?
... und zukünftigen Generationen etwas hinterlassen ...
Und wenn die kommenden Generationen noch verwöhnter sind?? Grüße
bastla
bastla
Grüße zurück
Biber
[/ nochmal OT]
[immer noch OT]
@Biber
... aber sieh's mal so: vielleicht kann er ein anderes Mal noch so 20, 30 Adressen damit rausholen - dann muss es uns das schon wert gewesen sein ...
So gesehen kann ich eigentlich nur noch mein Substandard-Script rechtzeitig wieder einstampfen (gut, dass ich immer die recyclebaren Bytes verwende ) ...
Grüße
bastla
[/immer noch OT]
@Biber
Oh nein... keine sinnentstellenden Zitate bitte: "Manchmal sind es mehr als 60 IPs...", nicht im Durchschnitt.
Was bist Du heute wieder streng - ah so, is ja noch immer Montach ...Für die Abarbeitung dieser 60 verträumten IP-Zeilen von einem Game-Server haben ein paar unbezahlbar gute Skript-Virtuosen genauso viele Skript-Zeilen aus der Tastatur geschüttelt... Ob das volkswirtschaftlich vertretbar ist...?
Unter diesem Aspekt (insbes hinsichtlich Game-Server) dürfte der Thread eigentlich schon gar nicht mehr existieren ...... aber sieh's mal so: vielleicht kann er ein anderes Mal noch so 20, 30 Adressen damit rausholen - dann muss es uns das schon wert gewesen sein ...
Und wenn die kommenden Generationen noch verwöhnter sind??
Wieso beschleicht mich das Gefühl, dass Du die Fragezeichen hättest einsparen können?So gesehen kann ich eigentlich nur noch mein Substandard-Script rechtzeitig wieder einstampfen (gut, dass ich immer die recyclebaren Bytes verwende ) ...
Grüße
bastla
[/immer noch OT]
Hallo Smiley!
Da Du lernen willst, vorweg zu Deinen Fragen:
Zum suboptimalen Ergebnis des Scripts:
Versuch es bitte einmal mit den folgenden beiden (von Dir oben als Beispiel geposteten) Zeilen als "ipliste.txt":
Mit der (eben noch mal runtergeladenen) geposteten Version des Scripts erhalte ich wunschgemäß folgende "ips.txt":
Um Unicode als Fehlerursache ausschließen zu können, kannst Du einfach mit
von der Kommandozeile eine ASCII-Version erzeugen und diese als "EinDatei" verwenden.
Zum RegEx
Die Interpretation des Suchbegriffes sollte nicht allzu schwierig sein - aber zur Sicherheit aus der VBS-Onlinehilfe:
Zu beachten wären ev die verwendeten Leerzeichen an Anfang und Ende (sollten, da der Batch an dieser Stelle getrennt hatte, aber nicht das Problem sein).
Grüße
bastla
Es funktioniert nicht, zeigt auch keine Fehlermeldung an, aber schreibt ips.txt neu, jedoch ohne Inhalt.
Kann eigentlich nur darauf zurückzuführen sein, dass keine Adressen gefunden werden, was wiederum als mögliche Ursachen einen unrichtigen RegEx oder unpassende Ausgangsdaten (zB weil in Unicode) haben könnte ...Da Du lernen willst, vorweg zu Deinen Fragen:
"T = fso.OpenTextFile(EinDatei).ReadAll " Ist das T nicht eine Variable; muss es deshalb nicht hinter "Set" stehen?
T ist eine Stringvariable, keine Objektvariable - daher kein "Set" - und enthält den gesamten Dateiinhalt der "EinDatei".Außerdem zeigt mir KEINEN Fehler an, wenn ich hier draus: "For Each Result In rE.Execute(T); Aus.WriteLine Trim(Result.Value)", das mache: "For Each Result In rE.Execute(T); Aus.WriteKSTAKGJHEKLKVine Trim(Result.Value)", was bedeutet, dass der "Executor", wenn man das so schreiben kann, nicht bis dahin kommt.
"Nicht bis dahin" ist nicht ganz richtig - wenn kein passender Text gefunden wird, läuft die (abweisende) Schleife nur einfach 0-mal ...Was ist hier eigenltich der Befehl, der den Text nach "rE.Pattern" durchsucht?
Das Durchsuchen erfolgt mittels "rE.Execute(T)
" - die Ergebnisse (wenn es denn welche gibt) werden dann mit der "For Each
"-Schleife durchlaufen."rE.Pattern" wird ja nur deklariert und liegt gelangweil in der Mitte, oder nicht?
Nicht ; "Pattern
" wird nicht deklariert, sondern erhält als Property des "RegExp
"-Objektes eine Wertzuweisung (den Suchstring); verwendet wird dieser Wert dann beim "Execute
".Zum suboptimalen Ergebnis des Scripts:
Versuch es bitte einmal mit den folgenden beiden (von Dir oben als Beispiel geposteten) Zeilen als "ipliste.txt":
0/32 (1) 87.106.84.31:27038 [Launch] deathrun_insane 2972 5460 182 202 612s 160km (99mi) , 89.94% 0
12/16 62.104.179.121:27015 [Launch] surf_ski_2 8029 14917 5 417 33m37s 176km (109mi) Hamburg, 04 95.03% 0
87.106.84.31:27038
62.104.179.121:27015
type ipliste.txt iplisteASCII.txt
Zum RegEx
" \d+\.\d+\.\d+\.\d+\:\d+ "
\ | Markiert das folgende Zeichen als Sonder- oder wortgenaues (literales) Zeichen. |
. | Entspricht allen Einzelzeichen außer einem Zeilenumbruchzeichen. [Anm.: wird aber jeweils escaped] |
+ | Entspricht dem vorhergehenden Zeichen ein oder mehrere Male. |
\d | Entspricht einer Ziffer. Äquivalent zu [0-9]. |
Zu beachten wären ev die verwendeten Leerzeichen an Anfang und Ende (sollten, da der Batch an dieser Stelle getrennt hatte, aber nicht das Problem sein).
Grüße
bastla
Hallo Smiley!
An TAB hatte ich nun tatsächlich (noch) nicht gedacht ...
Ob die Nachwelt tatsächlich von diesem Thread profitieren wird, lasse ich mal dahingestellt - anyhow, wenn's Dir (wie auch immer) geholfen hat, ist's ja auch schön ...
Grüße
bastla
An TAB hatte ich nun tatsächlich (noch) nicht gedacht ...
Mit VBS ist eig. in diesem Sinn auch komplizierter
Dazu wäre vielleicht anzumerken, dass auch VBS relativ "sauber" geschrieben werden könnte (inkl "Option Explicit
" und Deklarationen; letztere allerdings ohne Typ, da generell "Variant
" verwendet wird ) - meine Scripts sind allerdings meist etwas "kompakt" gehalten.Ob die Nachwelt tatsächlich von diesem Thread profitieren wird, lasse ich mal dahingestellt - anyhow, wenn's Dir (wie auch immer) geholfen hat, ist's ja auch schön ...
Grüße
bastla