2016-05-12 3 views
2

Beispiel meiner Protokolldatei mit Pings auf verschiedenen IP-Adressen.wie bestimmte Zeilen aus Text in einen anderen Text mithilfe von Stapel extrahiert werden.

Pinging 10.62.36.161 with 32 bytes of data: 
Request timed out. 
Request timed out. 
Request timed out. 
Request timed out. 

Ping statistics for 10.62.36.161: 
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss), 

================================================= 

Pinging src.g03.yahoodns.net [98.137.236.150] with 32 bytes of data: 
Reply from 98.137.236.150: bytes=32 time=203ms TTL=43 
Reply from 98.137.236.150: bytes=32 time=204ms TTL=45 
Reply from 98.137.236.150: bytes=32 time=192ms TTL=43 
Reply from 98.137.236.150: bytes=32 time=211ms TTL=43 

Ping statistics for 98.137.236.150: 
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), 
Approximate round trip times in milli-seconds: 
    Minimum = 192ms, Maximum = 211ms, Average = 202ms 

Ich möchte mit Request timed out einschließlich der IP-Adresse, alle Linien bekommen ich pinged. Drucken Sie dann die Zeilen in einer anderen Datei aus.

Irgendeine Idee, wie man dazu kommt?

gibt es einen Code, den ich gefunden habe. Das einzige Problem war, dass die Ergebnisse 3 zusätzliche Linien zeigten. Code:

@echo off 
set log=C:\Users\"name"\Desktop\log.txt 
set test=C:\Users\"name"\Desktop\test.txt 

setlocal EnableDelayedExpansion 
set numbers= 
for /F "delims=:" %%a in ('findstr /I /N /C:"Request" %log%') do (
set /A before=%%a-1, after=%%a+1 
set "numbers=!numbers!!before!: !after!: " 
) 
(for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %log% ^| findstr /B "%numbers%"') do echo %%b) > %test% 
pause 

die Ergebnisse Ich habe:

Pinging 10.62.36.161 with 32 bytes of data: 
Request timed out. 
Request timed out. 
Request timed out. 
Request timed out. 
ECHO is off. 
Reply from 8.8.8.8: bytes=32 time=6ms TTL=49 
Reply from 8.8.8.8: bytes=32 time=5ms TTL=49 

überall ich falsch gemacht habe?

+0

Warum sind Sie mit '% log%' durch eine 'for' Schleife (du bist nicht, übrigens; Ihnen fehlen die Klammern um '% log%')? Sie müssen das überhaupt nicht tun. Nur 'findstr/C:" Anfrage "% log% >>% test%' – SomethingDark

+0

wahrscheinlich viel einfacher zu parsen, die "Ping" -Ausgabe anstelle einer Logdatei. Siehe zum Beispiel [diese Antwort] (http://stackoverflow.com/a/24965777/2152082) – Stephan

+0

@SomethingDark danke für Ihre Antwort. Ich habe den Code ausgeführt.es gab mir nur die Zeilen, die das Wort enthalten. Ich brauche auch die IP-Adresse der Leitung. Danke fürs Helfen! –

Antwort

2

Der Ansatz mit FINDSTR kann hier nicht funktionieren, da diese Konsolenanwendung nicht zum Suchen von Blöcken geeignet ist. Es dient zum Suchen einer Zeichenfolge in einer Zeile und gibt die Zeile mit der gefundenen Zeichenfolge aus. Hier

ist eine kommentierte Batch-Datei für diese Aufgabe:

@echo off 
setlocal EnableDelayedExpansion 
set "LogFile=%USERPROFILE%\Desktop\log.txt" 
set "ResultsFile=%USERPROFILE%\Desktop\results.txt" 

rem Exit this batch file if the log file does not exist. 
if not exist "%LogFile%" exit /B 

rem Delete the results file if existing for a previous run. 
if exist "%ResultsFile%" del /F "%ResultsFile%" 

rem Process the log file line by line with assigned the first 
rem three space or tab separated strings of each line to the 
rem loop variables A, B and C for further investigation. 
for /F "usebackq tokens=1-3" %%A in ("%LogFile%") do (

    rem Is the first string on the line the word "Pinging"? 
    if "%%A" == "Pinging" (
     set "Count=0" 
     rem Is the third string "with"? 
     if "%%C" == "with" (
      rem The second string is the IP address and no name. 
      set "Name=" 
      set "IP=%%B" 
     ) else (
      rem The second string is the name and the third string is the 
      rem IP address enclosed in square brackets which are removed. 
      set "Name= %%B" 
      set "IP=%%C" 
      set "IP=!IP:~1,-1!" 
     ) 
    ) else if "%%A %%B %%C" == "Request timed out." (
     rem This is a line with information that the request timed out. 
     rem Increment count and if it reaches 3, then reaching this IP 
     rem failed three times and IP and name are written into results file. 
     set /A Count+=1 
     if !Count! == 3 echo !IP!!Name!>>"%ResultsFile%" 
    ) 
) 

endlocal 

Anmerkung 1: Die Leerzeichen in set "Name= %%B" ist am besten ein horizontales Tabulatorzeichen und nicht eine Folge von 1 oder mehr Leerzeichen als Browser zeigt nach HTML-Standard an.

Anmerkung 2: Für eine gültige CSV-Datei als Ergebnisdatei mit Tabulatorzeichen als Trenn wäre es notwendig, das Tabulatorzeichen in set "Name= %%B" und legen sie in der Zeile mit echo !IP!!Name! zwischen !IP!!Name! und zu entfernen.

Um die verwendeten Befehle und ihre Funktionsweise zu verstehen, öffnen Sie ein Eingabeaufforderungsfenster, führen Sie die folgenden Befehle aus und lesen Sie alle Hilfeseiten, die für jeden Befehl angezeigt werden, sorgfältig durch.

  • del /?
  • echo /?
  • endlocal /?
  • exit /?
  • for /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?
Verwandte Themen