Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

FINDSTR Befehl für strikt aufeinanderfolgende Sequenzelementen

Frage Entwicklung Batch & Shell

Mitglied: dedalus2011

dedalus2011 (Level 1) - Jetzt verbinden

04.04.2012 um 19:41 Uhr, 2870 Aufrufe, 23 Kommentare

Hallo,

gibt's eine Möglichkeit mit dem "findstr" Befehl die Sequenz ("Benutzername: ABC " (ohne die 1 am Ende, und auch wenn möglicherweise Leerzeichen dazwischen liegen) in der folgenden Struktur eindeutig zu erkennen?

Benutzername : ABC1


Die Sequenz soll aber in der Struktur

Benutzername : FGH ABC1


nicht gefunden werden. Also die Sequenzelementen müssen strikt nacheinander gefunden werden


Freue mich über jeden Hinweis

Grüße

dedalus2011
Mitglied: bastla
04.04.2012 um 19:42 Uhr
Hallo dedalus2011!

Verwende den Schalter "/c:" ...

... und gelegentlich "findstr /?"

Grüße
bastla
Bitte warten ..
Mitglied: dedalus2011
04.04.2012 um 19:52 Uhr
Hallo bastla,

habe schon probiert, die Sequenz "Benutzername: ABC" wird aber nicht gefunden (wegen dem "1" am Ende). Sobald der Schalter /r verwendet wird, findet aber findstr die Sequenz "Benutzername: ABC" auch in der Struktur

Benutzername : FGH ABC1

was nicht erwünscht wird.

Grüße
dedalus2011
Bitte warten ..
Mitglied: bastla
04.04.2012 um 19:58 Uhr
Hallo dedalus2011!

Soferne Du nicht ein zusätzliches "/x" oder "/e" verwendest, sollte das funktionieren:
D:>echo Benutzername : ABC1 |findstr /c:"Benutzername : ABC" 
Benutzername : ABC1 
 
D:\>echo Benutzername : FGH ABC1 |findstr /c:"Benutzername : ABC" 
 
D:\>
bzw
D:\>type Text.txt 
gibt's eine M÷glichkeit mit dem "findstr" Befehl die Sequenz ("Benutzername: ABC 
 " (ohne die 1 am Ende, und auch wenn m÷glicherweise Leerzeichen dazwischen lieg 
en) in der folgenden Struktur eindeutig zu erkennen? 
 
Benutzername : ABC1 
 
 
Die Sequenz soll aber in der Struktur 
 
Benutzername : FGH ABC1 
 
D:\>findstr /c:"Benutzername : ABC" Text.txt 
Benutzername : ABC1 
 
D:\>
Grüße
bastla
Bitte warten ..
Mitglied: dedalus2011
04.04.2012 um 20:14 Uhr
Hallo bastla,

es kommen noch Leerzeichen zwischen drin (also zwischen "Benutzername" ":" und "ABC1"), und deswegen wird die Sequenz nicht gefunden. Problematisch dabei ist dass die Anzahl dieser Leerzeichen unterschiedlich sein kann. Gibt's dafür eine Lösung?

Grüße
dedalus2011
Bitte warten ..
Mitglied: bastla
04.04.2012 um 20:18 Uhr
Hallo dedalus2011!

Na dann eben
findstr /r /c:"Benutzername : *ABC"
Grüße
bastla
Bitte warten ..
Mitglied: Weiricth
04.04.2012 um 21:04 Uhr
lad dir doch Visual Studio Express runter und machs in VB.Net und gut ist
Bitte warten ..
Mitglied: dedalus2011
04.04.2012 um 21:15 Uhr
Hallo bastla,

super, bei mir hat's mit

findstr /i /r /c: Benutzername *: *ABC

geklappt - die option "case-insensitive" soll bei mir auch sein ;)

Grüße
dedalus2011
Bitte warten ..
Mitglied: Biber
04.04.2012 um 21:19 Uhr
Zitat von Weiricth:
lad dir doch Visual Studio Express runter und machs in VB.Net und gut ist
Alternativ dazu vielleicht ne gebrauchte Cray?
Oder einen 476-Teile-Chrom-Vanadium-Knarrenkasten aus dem örtlichen Profi-Baumarkt?

Du hast schon "die Anforderung" gelesen und das zwischen den Zeilen stehende "Ich möchte vor der nächsten Steuerrreform fertig werden!" ?

Immer wieder erstaunt ob der Vielfältigkeit der Lösungsansätze dieses Forums
Biber
Bitte warten ..
Mitglied: Weiricth
04.04.2012 um 21:33 Uhr
Zitat von Biber:
> Zitat von Weiricth:
> ----
> lad dir doch Visual Studio Express runter und machs in VB.Net und gut ist
Alternativ dazu vielleicht ne gebrauchte Cray?
Oder einen 476-Teile-Chrom-Vanadium-Knarrenkassen vom örtlichen Profi-Baumarkt?

Du hast schon "die Anforderung" gelesen und das zwischen den Zeilen stehende "Ich möchte vor der nächsten
Steuerrreform fertig werden!" ?

Immer wieder erstaunt ob der Vielfältigkeit der Lösungsansätze dieses Forums
Biber

ja stell dir vor lesen kann ich. Ich finds eher erstaunlich das es dann leute gibt die dann dumme posts machen. aber zurück zu kommen

das ist ein zweizeiler in vb.net. desweitern ist die Performance um ein wesentliches erhöht, und kein dummer anwender kann im script rumwurschteln. Und wenn jemand sowas in batch macht hat er schon so viel verstand das er es auch in vb.net hin bekommt.
Bitte warten ..
Mitglied: bastla
04.04.2012 um 21:43 Uhr
@Weiricth
das ist ein zweizeiler in vb.net
Wäre doch nett von Dir, wenn Du dedalus2011 diese beiden Zeilen auch anbieten würdest ...

Grüße
bastla
Bitte warten ..
Mitglied: Weiricth
04.04.2012 um 22:04 Uhr
ok wenns mann verkaufs fertig programmiert sinds mehr zeilen. aber hier das komplette modul.

01.
Imports System.IO 
02.
 
03.
Module Module1 
04.
 
05.
    Dim p_text As String() 
06.
    Dim p_DateinameInklPfad As String 
07.
 
08.
 
09.
    Sub Main() 
10.
        Dim zeile As Integer = 0 
11.
        Dim suchtext As String = "" 
12.
        p_DateinameInklPfad = "C:\test.txt" 
13.
        lesen() 
14.
 
15.
        For i As Integer = 0 To p_text.Length - 1 Step 1 
16.
            If p_text(i).IndexOf(suchtext) > 0 Then 
17.
                zeile = i 
18.
                'etweder mit exit oder ausgabe aller 
19.
                Console.WriteLine(p_text(i)) 
20.
                Exit For 
21.
            End If 
22.
        Next 
23.
    End Sub 
24.
 
25.
    Public Sub lesen(Optional ByVal ToLower As Boolean = False, Optional ByVal ToUpper As Boolean = False) 
26.
        ReDim Preserve p_text(0) 
27.
        p_text(0) = "false" 
28.
        Try 
29.
            ' --- Datei öffnen 
30.
            Dim fs As FileStream = New FileStream(p_DateinameInklPfad, FileMode.OpenOrCreate, FileAccess.ReadWrite) 
31.
            ' --- Stream öffnen 
32.
            Dim r As StreamReader = New StreamReader(fs) 
33.
            ' --- Zeiger auf den Anfang 
34.
            r.BaseStream.Seek(0, SeekOrigin.Begin) 
35.
            ' --- Alle Zeilen lesen und an Console ausgeben 
36.
            Dim i As Integer = 0 
37.
            While r.Peek() > -1 
38.
                ReDim Preserve p_text(i) 
39.
                p_text(i) = r.ReadLine() 
40.
                If ToLower Then 
41.
                    p_text(i).ToLower() 
42.
                End If 
43.
                If ToUpper Then 
44.
                    p_text(i).ToUpper() 
45.
                End If 
46.
                i = i + 1 
47.
            End While 
48.
            ' --- Reader und Stream schließen 
49.
            r.Close() 
50.
            fs.Close() 
51.
        Catch ex As Exception 
52.
            ' txtDatei_Logfile_Schreiben(ex.Message, txt_Logfile) 
53.
        End Try 
54.
    End Sub 
55.
 
56.
End Module
Bitte warten ..
Mitglied: bastla
04.04.2012 um 22:12 Uhr
Hallo Weiricth!

Falls Du doch noch ein paar Zeilen einsparen möchtest:
  • Die Variable "zeile" wird nicht wirklich verwendet.
  • Anstelle des zeilenweisen Einlesens und der Verwendung von "ReDim" böte sich ein Einlesen "am Stück" und ein "Split" anhand der Zeilenschaltungen an.

Was mir etwas fehlt, ist die Berücksichtigung der variablen Anzahl an Leerzeichen im Suchtext - Stichwort "RegEx"...

Grüße
bastla
Bitte warten ..
Mitglied: mrtux
04.04.2012 um 22:16 Uhr
Hi !

Zitat von Weiricth:
ja stell dir vor lesen kann ich. Ich finds eher erstaunlich das es dann leute gibt die dann dumme posts machen. aber zurück
zu kommen

Ui da hat aber einer Humor mit dem Schöpflöffel inhaliert.... :-P

Mhhh c++ wäre ja auch noch eine Möglichkeit, wobei ich eher für Delphi.net wäre aber ob das mit echten zwei Zeilen klappt....Nee, die bräuchte schon für die Deklaration....Egal...

mrtux
Bitte warten ..
Mitglied: Weiricth
04.04.2012 um 22:29 Uhr
die var zeile ist weil mir nicht klar ist ob er noch weiter machen möchte deshalb speicher ich diese raus .

des redim kommt bei mir aus ner funktion bzw klasse raus. Das grund lesen kommt von google da hab ich jetzt nicht nachgeschaut bzw. verbessert.

Bezüglich RegEx hab ich grad nicht dran gedacht hier geändert

01.
    Sub Main() 
02.
        Dim zeile As Integer = 0 
03.
        Dim suchtext As String = "Benutzername" 
04.
        Dim suchtext As String = "ABC" 
05.
        p_DateinameInklPfad = "C:\test.txt" 
06.
        lesen() 
07.
 
08.
        For i As Integer = 0 To p_text.Length - 1 Step 1 
09.
            If p_text(i).IndexOf(suchtext) > 0 and  p_text(i).IndexOf(suchtext2) > 0 Then 
10.
                zeile = i 
11.
                'etweder mit exit oder ausgabe aller 
12.
                Console.WriteLine(p_text(i)) 
13.
                Exit For 
14.
            End If 
15.
        Next 
16.
    End Sub 
17.
 
Bitte warten ..
Mitglied: bastla
04.04.2012 um 22:37 Uhr
Hallo Weiricth!
If p_text(i).IndexOf(suchtext) > 0 and p_text(i).IndexOf(suchtext2) > 0 Then
würde genau wieder zum Anfang des Problems von dedalus2011 zurückführen, da damit auch "Benutzername : FGH ABC1" gefunden würde - daher ist tatsächlich RegEx gefragt ...

Grüße
bastla
Bitte warten ..
Mitglied: Weiricth
04.04.2012 um 22:49 Uhr
es ist zu spät zum denken

01.
 
02.
 
03.
    Sub Main() 
04.
        Dim zeile As Integer = 0 
05.
        Dim myRegex As New Regex("") 
06.
        Dim suchtext As String = "" 
07.
        p_DateinameInklPfad = "C:\test.txt" 
08.
        lesen() 
09.
 
10.
        For i As Integer = 0 To p_text.Length - 1 Step 1 
11.
            If myRegex.IsMatch(p_text(i)) Then 
12.
                zeile = i 
13.
                'etweder mit exit oder ausgabe aller 
14.
                Console.WriteLine(p_text(i)) 
15.
                Exit For 
16.
            End If 
17.
        Next 
18.
    End Sub 
19.
 
den RegEx must jemand ander machen da bin ich nicht fit drin.
Bitte warten ..
Mitglied: Skyemugen
05.04.2012 um 07:28 Uhr
... und dat is' jetzt schneller geschrieben als findstr /i /r /c: Benutzername *: *ABC, habe ich das richtig verstanden, ja?

Glückwunsch, jetzt weiß ich, warum einige Programmierer Fantasiekosten aufrufen, wenn die alle so arbeiten *gröhl*

zwei Zeilen ... das komplette Modul >50 Zeilen, ah hätte der TE auch schneller hinbekommen als die Batchdatei zu schreiben *Kopf nick* ... + Downloadzeit + Installationszeit ... jepp, hätte sich gelohnt, kaum mehr Aufwand

was für Leute hier rumeiern, unfassbar ... und am Ende kann er das Problem nicht einmal vollends lösen ...
Bitte warten ..
Mitglied: 106009
05.04.2012 um 07:37 Uhr
Zitat von Weiricth:
ja stell dir vor lesen kann ich. Ich finds eher erstaunlich das es dann leute gibt die dann dumme posts machen.

Fragt sich, wer hier "dumme posts" macht.

Typischer Fall von BTW5.
Bitte warten ..
Mitglied: Weiricth
05.04.2012 um 08:13 Uhr
1. Leute der will doch garantiert mehr als nur Findstr in seiner dummen batch datei machen und da wird er schnell aufs ende stoßen, bzw. die arbeit die er ins eine script gesteckt hat kann er nicht so einfach ins nächste übernehmen.

2. wissen wir nicht auf wievielen rechnern er es einsetzen will, welches unterschiedlichen OS Stände die haben etc.

3. Sieht sich des mit Benutzername und Sequenz sehr nach versuch der Authentifiziertung aus, und dann kann jeder drin rumpfuschen.

@Skyemugen: ja 50 zeichen weil das Modul schon fertige funktionen hat zu wieder verwendung was mann im Internet gleich finden kann. Das eigentliche Program hat gerade mal 15 zeilen und dabei sind die zeilen die VS auto erstellt schon dabei. Zum Thema Kosten, bzw download etc. wenn man sieht das ich nicht mal 10 min für das Programm gebraucht habe (siehe post zeit) aber dedalus über 3 Std für dann eine entgültige lösung gebraucht hat frag ich mich wer hat sich hier was gespart.
Bitte warten ..
Mitglied: Skyemugen
05.04.2012 um 08:35 Uhr
zu 1.) Bullshit, wenn man keine Ahnung hat ... der kommt so oder so wenn dann hier her, da nutzen ihm VB.Net Schnipsel noch weniger

zu 2.) Wayne, die Batch rennt auf mehr Windows-Systemen (Windows 95? SBS 2011? ... was immer belieben) als eine aus VB.Net erstellte .exe, die dann erst einmal .NET Framework 1.1 voraussetzt

zu 3.) nicht unser Problem, wenn wir jedes Mal darauf eingehen würden, im Batch-Bereich, hätten wir so einiges nicht geschnipselt, die Meisten wollen nur auslesen und für .csv XYZ tabellarisch aufführen ...

Ja, wer hat hier was gespart, 10min für ein Programm (ohne Download- und Installationszeit), das der TE auch nicht hinbekommen hätte und hier 3 Stunden eine endgültige Lösung gesucht hätte ... oder 27 Sekunden für eine Batchzeile, folgend aus einer anderen ... 3 Stunden, weil's kein Live-Chat-Support ist und weder der TE noch wir instant-messages raushauen ...

Mann, was willst du uns erzählen? Dein Zwei-Zeilen-Spruch war schon Gepose genug, darfst dich wieder aus dem Batch-Bereich entfernen.
Bitte warten ..
Mitglied: bastla
05.04.2012 um 11:34 Uhr
Hallo Skye!

Dass Du Dich gar so echauffieren magst ...

Abseits der vollmundigen Ansage von Weiricth ließe sich das natürlich durchaus mit nur ein paar Codezeilen umsetzen - etwa:
01.
Sub Main(ByVal Args As String()) 
02.
Dim suchtext As String = Args(0) 
03.
Dim p_DateinameInklPfad As String = Args(1) 
04.
Dim p_text As String() 
05.
Try 
06.
    p_text = Split(My.Computer.FileSystem.ReadAllText(p_DateinameInklPfad), vbNewLine) 
07.
Catch ex As Exception 
08.
    Environment.ExitCode = 1 
09.
    Exit Sub 
10.
End Try 
11.
Dim myRegex As New System.Text.RegularExpressions.Regex(suchtext) 
12.
For i As Integer = 0 To p_text.Length - 1 
13.
    If myRegex.IsMatch(p_text(i)) Then Console.WriteLine(p_text(i)) 
14.
Next 
15.
End Sub
wobei allerdings noch zumindest für die Aufrufparameter Überprüfung/Errorhandling zu ergänzen wäre ...
Was noch hinzukäme: Ich mag nicht glauben (aber auch nicht testen ), dass sich damit gegenüber einem "findstr" tatsächlich eine bessere Performance erzielen ließe ...

[Edit] Um aber zumindest noch einen Vorteil zu nennen: Mit einer leichten Modifikation würde das Ergebnis nicht mehr ganze Zeilen, sondern nur noch die dem Suchbegriff entsprechenden Strings umfassen:
01.
Sub Main(ByVal Args As String()) 
02.
Dim suchtext As String = Args(0) 
03.
Dim p_DateinameInklPfad As String = Args(1) 
04.
Dim p_text As String 
05.
 
06.
Try 
07.
    p_text = My.Computer.FileSystem.ReadAllText(p_DateinameInklPfad) 
08.
Catch ex As Exception 
09.
    Environment.ExitCode = 1 
10.
    Exit Sub 
11.
End Try 
12.
Dim myRegex As New System.Text.RegularExpressions.Regex(suchtext) 
13.
For Each Match In myRegex.Matches(p_text) 
14.
    Console.WriteLine(Match) 
15.
Next 
16.
End Sub
Aufzurufen wäre dann mit dem Suchbegriff
"Benutzername : *ABC\S*"
um als Ergebnis "Benutzername : " + Leerzeichen + ABC" + alle bis zum nächsten "Whitespace" (also Leerzeichen, TAB, Zeilenschaltung) folgenden Zeichen zu erhalten.

Auch "Benutzername :" und die folgenden Leerzeichen ließen sich durch Verwendung eines SubMatches noch leicht eliminieren:
Console.WriteLine(Match.Groups(1))
und Suchbegriff
"Benutzername : *(ABC\S*)"
[/Edit]

Grüße
bastla
Bitte warten ..
Mitglied: dedalus2011
05.04.2012 um 13:42 Uhr
Hallo bastla,

in der automatisch generierten Protokolldatei in der auf diese Sequenz durchsucht werden soll kommt auch das Pipe-Symbol vor, was dafür sorgt, dass das Programm abbricht sobald findstr diese Zeile parst

z.B. die Zeile sieht ungefähr so aus: "|Prozedur UNLOAD Zeile 206 (ohne das Anführungszeichen, bricht das Programm nicht ab!)

Im Programm selbst wird Pipelining verwendet, z.b:

01.
 echo "%Zeile%"|findstr /i /r /c:"Benutzername : *ABC">nul 
Was kann man dagegen tun?

Grüße
dedalus2011
Bitte warten ..
Mitglied: bastla
05.04.2012 um 14:09 Uhr
Hallo dedalus2011!

Versuch es so:
echo "%Zeile:|=%"|findstr /i /r /c:"Benutzername : *ABC">nul
bzw mit
01.
setlocal enabledelayedexpansion 
02.
echo !Zeile!|findstr /i /r /c:"Benutzername : *ABC">nul 
03.
endlocal
Allerdings ist eine ungerade Anzahl von Anführungszeichen meist ohnehin heikel ...

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
gelöst Findstr - code für schwieriger Abfrage gesucht (9)

Frage von reissaus73 zum Thema Batch & Shell ...

Batch & Shell
gelöst Mal eine neue Art von Abfrage mit findstr (8)

Frage von DaTobsn zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...