Batch - Zeile mit bestimmtem Wert suchen und daraus einen Wert extrahieren

JahniS01

Cadet 1st Year
Registriert
Dez. 2017
Beiträge
11
Hallö zusammen.

Meine Frage wird wohl bei einigen Kopfschütteln veranlassen,
aber ich komm leider nicht auf die Lösung.

Ich möchte mittels Batch eine log Datei nach einer Seriennummer (z.B. 16147133535038662771) durchsuchen,
wenn gefunden soll aber nicht die ganze Zeile ausgegeben werden, sondern nur der eine Wert der hinter "Hex:" steht.
Den Suchstring kann es in der Datei mehrfach geben, teils mit - teils ohne Hex Wert.
Ich möchte als Ergebnis aber nur einmalig den Hex wert in einer Variable,
die Zeilen ohne diesen Wert sollten ignoriert werden.

Die Zeilen unterscheiden sich auch teilweise.
Suchstring ist immer die dezimale Seriennummer im Beispiel: "16147133535038662771"
ausgegeben soll immer der Hex wert davon, also "E016246620C6E873"

Beispiele:
2023-01-19 14:21:58: 19.01.2023 14:21:58:094 2023-01-19 14:21:58 Ticket Insert -> registriert 16147133535038662771
2023-01-19 14:22:02: 19.01.2023 14:22:02:453 2023-01-19 14:22:02 Karte gültig 16147133535038662771
2023-01-19 14:22:02: 19.01.2023 14:22:02:453 Serial: 16147133535038662771 Hex: E016246620C6E873 2023-01-19 14:22:02
2023-01-19 14:21:54: 19.01.2023 14:21:54:234 2023-01-19 14:21:54 Ticket Update 16147133535038662771
2023-01-19 14:22:02: 19.01.2023 14:22:02:484 Austritt Serial: 16147133535038662771 update ok 2023-01-19 14:22:02


Bin bisher leider nicht weiter gekommen, als mir einfach alle Zeilen mit der gesuchten Seriennummer ausgeben zu lassen :freak:

Code:
@echo off

:START
echo.
echo.
set /p Kartennummer=Kartennummer (z.B. 16147133535127091895):
for /f "delims=" %%i in ('findstr "%Kartennummer%" "Kartenhistory.log"') do echo %%i
echo.
echo.
pause

:ENDE
cls
goto START

Für euch ist das sicher eine Kleinigkeit,
Danke schonmal :)
LG
 
Zuletzt bearbeitet:
Danke dir.
Es müsste leider mit Windows Onboard Mitteln realisiert werden, da ich auf dem Client keine Fremdsoftware installieren kann/möchte.

Da ich mittels Batch schon gewisse andere Sachen auswerte, würde es sich für mich am besten eignen.

lg
 
Du könntest zwei find oder findstr pipen und so einen UND-Filter bauen.

type history.log | find "11223344" | find "Hex"

Erst werden alle Zeilen mit der SerienNr gefiltert und aus diesem Ergebnis im zweiten Schritt die Hex. Man erhält also alle Zeilen, die die SerienNr und und Hex enthalten. Anschließend die gewünschte Info aus der Zeile parsen.
 
  • Gefällt mir
Reaktionen: s1ave77
Wenn die Zeile mit dem 'Hex:" immer gleich aufgebaut ist:
Code:
@echo off
setlocal EnableExtensions
setlocal EnableDelayedExpansion
:START
echo.
echo.
set /p Kartennummer=Kartennummer (z.B. 16147133535127091895):
for /f "tokens=1,2,3,4,5,6,7,8 delims= " %%a in ('type Kartenhistory.log ^| findstr /i "%Kartennummer%" ^| findstr /i "Hex:"') do echo %%h
echo.
echo.
pause

:ENDE
cls
goto START
 
@mae1cum77 - das funktioniert super danke!!
Kannst du mir noch verraten wie ich den Hex Wert dann nur 1x ausgeben kann falls es mehrere Zeilen gibt die darauf zutreffen? (Selbe Zeile aber zu verschiedenen Uhrzeiten/Datum)
Es würde reichen wenn nur der erste Treffer ermittelt/ausgegeben wird.

Vielen Danke für die schnelle Hilfe euch allen :)
 
  • Gefällt mir
Reaktionen: s1ave77
PowerShell:
 Select-String -Path .\log.txt '16147133535038662771 Hex: ([a-zA-Z0-9]+) ' -AllMatches | Foreach-Object {$_.Matches} | Foreach-Object {$_.Groups[1].Value}

Code:
PS C:\Temp> cat .\log.txt
2023-01-19 14:21:58: 19.01.2023 14:21:58:094 2023-01-19 14:21:58 Ticket Insert -> registriert 16147133535038662771
2023-01-19 14:22:02: 19.01.2023 14:22:02:453 2023-01-19 14:22:02 Karte gültig 16147133535038662771
2023-01-19 14:22:02: 19.01.2023 14:22:02:453 Serial: 16147133535038662771 Hex: E016246620C6E873 2023-01-19 14:22:02
2023-01-19 14:21:54: 19.01.2023 14:21:54:234 2023-01-19 14:21:54 Ticket Update 16147133535038662771
2023-01-19 14:22:02: 19.01.2023 14:22:02:484 Austritt Serial: 16147133535038662771 update ok 2023-01-19 14:22:02
PS C:\Temp> Select-String -Path .\log.txt '16147133535038662771 Hex: ([a-zA-Z0-9]+) ' -AllMatches | Foreach-Object {$_.Matches} | Foreach-Object {$_.Groups[1].Value}
E016246620C6E873
PS C:\Temp>
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: NotNerdNotDau
JahniS01 schrieb:
Es würde reichen wenn nur der erste Treffer ermittelt/ausgegeben wird.
Code:
@echo off
setlocal EnableExtensions
setlocal EnableDelayedExpansion
:START
echo.
echo.
set /p Kartennummer=Kartennummer (z.B. 16147133535127091895):
for /f "tokens=1,2,3,4,5,6,7,8 delims= " %%a in ('type Kartenhistory.log ^| findstr /i "%Kartennummer%" ^| findstr /i "Hex:"') do echo %%h && goto :PAUSE
:PAUSE
echo.
echo.
pause

:ENDE
cls
goto START
 
Zurück
Oben