Batch-Skripte unter Windows: Ergebnis von grep in Variable speichern

Dr@

Grand Admiral Special
Mitglied seit
19.05.2009
Beiträge
12.791
Renomée
4.066
Standort
Baden-Württemberg
  • BOINC Pentathlon 2011
  • BOINC Pentathlon 2012
Hallo,

Hoffentlich kann mir jemand weiterhelfen. Ich bin blutiger Anfänger, wenn es um Batch-Skripte geht.

Worum es geht:

Ich will aus einer Datei "Datei.log" den vollständigen Inhalt einer Zeile in einer Variablen speichern. Der Anfang der Zeile ("Zeilenanfang") besteht aus zwei Worten, die durch ein Leerzeichen voneinander getrennt sind, und ist bekannt. Der Inhalt der Variablen soll dann an anderer Stelle zusammen mit einem Text ausgegeben werden.

Ich nutze GNU grep. Ohne den Inhalt in einer Variablen zu speichern, funktioniert das Ganze mit:
Code:
grep -U "Zeilenanfang" Datei.log
ohne Probleme. In der CMD wird der vollständige Inhalt (es sind auch Leerzeichen, Kommas und Punkte enthalten) der Zeile ausgegeben.

Woran ich aber kläglich scheitere, ist dann die Speicherung in einer Variablen. Was ich bisher gefunden habe:
Code:
@echo off

for /F "usebackq" %%I in (`grep -U "Zeilenanfang" Datei.log`) do set Var1=%%I

echo In der Zeile steht: %Var1%
Da wird mir dann aber nur das erste Wort meines Such-Strings "Zeilenanfang" ausgegeben.

Wenn das funktioniert will ich die Ausgabe in eine andere Datei umleiten. Also in etwas so:
Code:
@echo off

for /F "usebackq" %%I in (`grep -U "Zeilenanfang" Datei.log`) do set Var1=%%I

echo In der Zeile steht: %Var1% >> Datei2.rt

Was mache ich falsch? Mein Hauptproblem ist halt, dass bei der Übergabe an die Variable lediglich alle Zeichen bis zum ersten Leerzeichen übergeben werden.
Hat jemand einen anderen Vorschlag, wie ich per Batch das gewünschte Ergebnis erhalte?

Vielen Dank im Voraus.
 
Dann löse ich das Problem mal selber auf. :)

Nachdem ich mich von grep gelöst hatte, habe ich für die Windowsfunktion find folgenden Syntax gefunden:

Code:
FOR /F "tokens=1 delims==" %%A IN ('FIND "Zeilenanfang" Datei.log') DO SET Var1=%%A

find durch grep ersetzt bringt dann das gewünschte Ergebnis. Bei find wird merkwürdigerweise zunächst der Dateiname in die Variable geschrieben und danach erst die gesuchte Textzeile. *noahnung*
 
Code:
@echo off

for /F "delims=" %%i in ('grep -U "Zeilenanfang" Datei.log') do set Var1=%%i

echo In der Zeile steht: %Var1%
sollte funktionieren. Das "delims=" bedeutet: kein Zeichen dient als Delimiter (Trennzeichen) - standardmäßig sind Leerzeichen (und Tabs?) Delimiter und daher auch die Ausgabe nur bis zum Trennzeichen. Alternativ müsste auch dies funktionieren:
Code:
@echo off

for /F "tokens=*" %%i in ('grep -U "Zeilenanfang" Datei.log') do set Var1=%%i %%j

echo In der Zeile steht: %Var1%
Mit "tokens=" gibt man die durch Delimiter getrennten Teile an, die man haben will (so gesehen "die Spalten"). Die kann man durchnumerieren oder aber, wie in diesem Beispiel, mit * angeben, um den gesamten Rest zu holen, der dann in der Variable %%j landet.

MfG Dalai
 
Zurück
Oben Unten