tds-raico
Goto Top

Variable füllen mit Daten aus zwei Datein?

per batch Datei (cmd) aus zwei verschiedenen Dateien einen Wert herausfiltern und diesen in eine Variable übergeben

Hallo zusammen,

Hab mich jetzt zwei Tage durch dieses Forum gewühlt und viel neues erfahren, aber leider nicht das gefunden, was ich suche face-sad
Deshalb hoffe ich, das mir hier jemand helfen kann.

Ich habe zwei Dateien

Datei 1: abteilung.log
Rechner	Abteilung
Albany_alt	Ausgemustert
Archhse1	Frei, warten auf neue Verwendung
Bayside	SAPEdiAdmin
Hurley	Ausgemustert
CSB1A3P	Ausgemustert
BTISAP01	Kundeneigene
Fulda	Frei, warten auf neue Verwendung
Chester-alt	Ausgemustert
SAPIR3	Ausgemustert
Dakota_alt	Ausgemustert
etc... etc...
Datei 2: onlycluster.log
SYSTEM|CH-jrsvpb1|CH-jrsvpb1|XXXXX|XXXXX|XXXXX|XXXXX|AIX 5.2|CH Betrieb
SYSTEM|CH-jrsapb1|CH-jrsvpb1|XXXXX|XXXXX|XXXXX|XXXXX|AIX 5.2|CH R/3-Business
SYSTEM|CH-jrsbq01|CH-jrsvq01|XXXXX|XXXXX|XXXXX|XXXXX|AIX 5.2|CH R/3-Business
SYSTEM|CH-jrsvpb1|CH-jrsvpb1|XXXXX|XXXXX|XXXXX|XXXXX|AIX 5.2|CH R/3-Business
SYSTEM|CH-jrsvq01|CH-jrsvq01|XXXXX|XXXXX|XXXXX|XXXXX|AIX 5.2|CH R/3-Business
SYSTEM|CH-spp00n1|CH-spp00ci|XXXXX|XXXXX|XXXXX|XXXXX|AIX 5.3|CH R/3-Business
SYSTEM|CH-spp00sh|CH-spp00ci|XXXXX|XXXXX|XXXXX|XXXXX|AIX 5.3|CH R/3-Business
SYSTEM|CH-spt00n1|CH-spt00ci|XXXXX|XXXXX|XXXXX|XXXXX|AIX 5.3|CH R/3-Business
SYSTEM|CH-spt00n2|CH-spt00ci|XXXXX|XXXXX|XXXXX|XXXXX|AIX 5.3|CH R/3-Business
SYSTEM|ksapcl1|sapkp1|XXXXX|XXXXX|XXXXX|XXXXX|HP UX 11.11|RSM (SAP EDI Admin)
SYSTEM|ksapcl2|sapkp1|XXXXX|XXXXX|XXXXX|XXXXX|HP UX 11.11|RSM (SAP EDI Admin)
SYSTEM|de06ap36|de06ap37|XXXXX|XXXXX|XXXXX|XXXXX|HP-UX 11.23|SAP Administration
SYSTEM|de06ap36|de06ap39|XXXXX|XXXXX|XXXXX|XXXXX|HP-UX 11.23|SAP Administration
SYSTEM|de06ap38|de06ap37|XXXXX|XXXXX|XXXXX|XXXXX|HP-UX 11.23|SAP Administration
SYSTEM|de06ap38|de06ap39|XXXXX|XXXXX|XXXXX|XXXXX|HP-UX 11.23|SAP Administration
SYSTEM|CSB2D1P|CSB6C1P|XXXXX|XXXXX|XXXXX|XXXXX|HP-UX B.11.0|Ausgemustert
SYSTEM|CSB2D2P|CSB6C1P|XXXXX|XXXXX|XXXXX|XXXXX|HP-UX B.11.0|Ausgemustert
SYSTEM|gwg-db1|gwg-sap|XXXXX|XXXXX|XXXXX|XXXXX|Linux RedHat ES 4.0|RSM (SAP EDI Admin)
SYSTEM|gwg-db1|gwg-db|XXXXX|XXXXX|XXXXX|XXXXX|Linux RedHat ES 4.0|RSM (SAP EDI Admin)
SYSTEM|gwg-db2|gwg-sap|XXXXX|XXXXX|XXXXX|XXXXX|Linux RedHat ES 4.0|RSM (SAP EDI Admin)
SYSTEM|gwg-db2|gwg-db|XXXXX|XXXXX|XXXXX|XXXXX|Linux RedHat ES 4.0|RSM (SAP EDI Admin)
SYSTEM|ost-db1|ost-db|XXXXX|XXXXX|XXXXX|XXXXX|Linux RedHat ES 4.0|RSM (SAP EDI Admin)
etc... etc...
Beide Dateien sind nicht gerade klein ;)

ok...
Unter Unix löse ich das Problem wie folgt...
CLIENT=`echo $1`
LOG=/nsr/logs/$CLIENT
ABTLOG="/madras/logs/abteilung.log"  
CLUSTERLOG="/madras/logs/onlycluster.log"  
ABT="UNBEKANNT"  

grep -iw $CLIENT $ABTLOG >/dev/null
if 
        [ $? = 0 ]
then
	ABT=`grep -iw $CLIENT $ABTLOG | grep -vi "\-alt" | grep -vi "\-neu" | cut -f2 | sort -u`  
else
	grep -iw $CLIENT $CLUSTERLOG >/dev/null
	if
		[ $? = 0 ]
	then
		ABT=`grep -wi $CLIENT $CLUSTERLOG | grep -vi "\-alt" | grep -vi "\-neu" | cut -d"|" -f9 | sort -u | tail -1`   
	fi
fi
echo "Abteilung: $ABT" >> $LOG  

Damit hab ich auf alle Fälle herausgefunden, welcher Client/Rechner zu welcher Abteilung gehört... und sollte er in keiner dieser beiden Dateien vorkommen... ist als Abteilung ja zumindest "unbekannT" vorgegeben...


In cmd hab ich jetzt findstr als "pendant" zum grep unter Unix gefunden... aber leider komm ich nicht viel weiter als:

@echo off
set SUCHBEGRIFF=%1
@findstr -I %SUCHBEGRIFF% c:\temp\abteilung.log
ok... damit wird zumindest schonmal die Zeile ausgegeben, in der sich der gesuchte String befindet...
Aber wie filter ich jetzt zumindest im Fall von abteilung.log genau diesen String heraus, sodass nur noch die Abteilung übrig bleibt und ich diese auch einer Variablen zuweisen kann?


Ich hoffe das war jetzt nicht zu umständlich gefragt? ;)


[Edit Biber] -Tags eingestreut. [/Edit]

Content-Key: 83464

Url: https://administrator.de/contentid/83464

Printed on: April 19, 2024 at 03:04 o'clock

Mitglied: 61319
61319 Mar 19, 2008 at 08:28:14 (UTC)
Goto Top
Hallo,

ich weiszwar nicht genau, wie die Lösung wäre, aber Du kannst auch mit dem for-befehl arbeiten.
Der kann dann auch gewisse Teile (token) einer Zeile zurück geben.

Gruß Niko
Member: bastla
bastla Mar 19, 2008 at 09:39:14 (UTC)
Goto Top
Hallo TDS-Raico und willkommen im Forum!

Wie schon von NKNKNK angemerkt, kannst Du mittels "for" eine Textdatei zeilenweise lesen und die gelesenen Zeilen anhand von "delims" zerlegen - für die "abteilung.log" sähe das so aus:
@echo off & setlocal
set "CLIENT=%~1"  
set "LOG=\\nsr\logs\%CLIENT%"  
set "ABTLOG=\\madras\logs\abteilung.log"  

REM set "SUCHBEGRIFF=%~1"   
REM Suchbegriff sollte doch eigentlich %CLIENT% sein, oder?

set "ABTEILUNG=unbekannt"  
for /f "tokens=1*" %%i in ('findstr /I "%CLIENT%" "%ABTLOG%"') do "set ABTEILUNG=%%j"  
echo %ABTEILUNG%>>%LOG%
Die Zerlegung erfolgt (ohne Angabe eines speziellen Delimiters) anhand von Leerzeichen oder Tabs. Als Ergebnis werden die einzelnen Teile ("tokens") in alphabetisch aufeinanderfolgende Variablen geschrieben - bei der Zerlegung oben steht demnach der Rechnername in %%i und alle danach noch folgenden Bestandteile der Zeile (ohne weitere Unterteilung wegen der Schreibweise 1*) in %%j.

Das "findstr" ließe sich noch verfeinern, indem Du den Schalter "/B" (Suchbegriff steht am Zeilenanfang) verwendest.

Grüße
bastla

P.S.: Dass Du zu den CMD-Befehlen jeweiils mit "/?" die Onlinehilfe aufrufen kannst, setze ich als bekannt voraus ...
Member: miniversum
miniversum Mar 19, 2008 at 09:55:49 (UTC)
Goto Top
Ja mit einem For sieht es dan so aus:
@echo off
set "SUCHBEGRIFF=%~1"
set "Datei=c:\temp\abteilung.log"
FOR /F "tokens=1,* delims= " %%i in ('findstr /I "%SUCHBEGRIFF%" "%Datei%"') do echo Rechner:%%i Abteilung:%%j

Wenn du das ganze mit onlycluster.log machen willst könnte dann die Forzeile so aussehen:
FOR /F "tokens=2,9 delims=^|" %%i in ('findstr /I "%SUCHBEGRIFF%" "%Datei%"') do echo Rechner:%%i Abteilung:%%j

Edit: ups zu langsam
Member: TDS-Raico
TDS-Raico Mar 19, 2008 at 11:48:09 (UTC)
Goto Top
P.S.: Dass Du zu den CMD-Befehlen jeweiils
mit "/?" die Onlinehilfe aufrufen
kannst, setze ich als bekannt voraus ...


Danke ;)


Also das Script sieht jetzt folgendermaßen auss und funktioniert auch genauso, wie es derzeitig funktionieren soll:
@echo off & setlocal
rem #### Variablen definieren
set "CLIENT=%~1"  
set "LOG=c:\progra~1\nsr\logs\%CLIENT%.txt"  
SET "DATUM=%date% %time%"  
set "ABT=UNBEKANNT"  
set "FIREWALL=unbekannt"  
set "ABTLOG=c:\progra~1\nsr\ueberwachung\abteilung.log"  
set "CLUSTERLOG=c:\progra~1\nsr\ueberwachung\onlycluster.log"  

rem #### Programstart
echo //logstart// >> %LOG%
echo Datum: %DATUM% MET >> %LOG%

for /f "tokens=1* " %%i in ('findstr /I "%CLIENT%" "%ABTLOG%"') do set ABT=%%j  
for /f "tokens=2,9 delims=^|" %%i in ('findstr /I "%CLIENT%" "%CLUSTERLOG%"') do set ABT=%%j  

echo Abteilung: %ABT% >> %LOG%
echo Client Netzwerkkartenseinstellung: %FIREWALL% >> %LOG%
nsrlog -f %LOG%
echo //logende// >> %LOG%
 

Vielen Dank also für eure Tipps und Tricks face-smile
Member: miniversum
miniversum Mar 19, 2008 at 12:43:13 (UTC)
Goto Top
Ähm..
Wenn du das so machst kannst du auch die Zeile
for /f "tokens=1* " %%i in ('findstr /I "%CLIENT%" "%ABTLOG%"') do set ABT=%%j
Weglassen weil die Variable %ABT% gleich in der nächsten Zeile überschrieben werden würde.
Willst du beide dateien durchsuchen ob in einer davon das ergebnis enthalten ist?
Member: TDS-Raico
TDS-Raico Mar 19, 2008 at 13:35:48 (UTC)
Goto Top
Ähm..
Wenn du das so machst kannst du auch die
Zeile
> for /f "tokens=1* " %%i in
('findstr /I "%CLIENT%"
"%ABTLOG%"') do set ABT=%%j
Weglassen weil die Variable %ABT% gleich in
der nächsten Zeile überschrieben
werden würde.
Willst du beide dateien durchsuchen ob in
einer davon das ergebnis enthalten ist?

Ja, es müssen beide Dateien durchsucht werden.
Denn normalerweise ist ein "Client" der NICHT in der abteilung.log zu finden ist, dann in der "onlycluster.log" zu finden...
Ist er in beiden Dateien NICHT zu finden... ist der "Kunde" selbstverantwortlich... die Fachabteilung in unserem Haus also nicht zuständig und somit "unbekannt"

Hab das mehrmals getestet und bis jetzt siehts gut aus.
Wir lassen das jetzt vorläufig erstmal bei einem unserer externen Kunden so bis nach Ostern laufen (Script wird jedesmal nach beenden einer Datensicherung aufgerufen) und wenn keine weiteren Problemchen auftauchen...
...wirds bei allen externen Kunden die unbedingt n Windowssystem als Backupserver einsetzen, aktiv geschaltet.

Glaub mir... ich würd lieber Unixsysteme einsetzen und mit Shellscripten arbeiten ;) Das kann ich wenisgtens ne Ecke besser als Bash Dateien unter Dos... Obwohl ich mit Dos und Windows 3.1 damals angefangen hab ;)
Member: miniversum
miniversum Mar 19, 2008 at 14:20:58 (UTC)
Goto Top
Naja stimt bei For geht das ja hintereinander. War grade ein Denkfehler von mir.

Hihi. seit win 3.1 hat sich das aber auch gut weiterentwickelt.