IP Adressen auslesen, kopieren, modifizieren
Hallo,
ich habe ein Problem bei der automatischen Abarbeitung folgenden Problems:
In einer semikolon-getrennten csv-Datei mit Netzwerkomponenten stehen deren IDs sowie im
Idealfall zwei IP-Adressen.
Leider ist der Idealfall relativ selten.
In dem ersten IP-Adressfeld sollen ausschließlich IP-Adressen stehen, deren 2. Oktett
größergleich 144 ist. Bei den IPs, bei denen dies nicht der Fall ist, steht in der Regel im
2. Oktett eine 136. Diese IPs sollen in das Feld IP2 kopiert werden. Ausserdem soll in IP1
die Umrechnung dieser Adresse nach folgendem Muster erfolgen:
10.(136+8).(3.Oktett+16).(4.Oktett)
Hier nun noch ein Auszug aus dieser Datei:
Search code;IP Address;IP Adresse 2
TESTCI;10.145.19.101;
R6504;10.144.79.33;
R88001;10.144.187.209;
R7436;10.144.181.49;
R7435;10.144.182.177;
R6189;10.136.43.97;10.144.75.97
R7391;10.144.161.49;
R7344;10.144.178.161;
R7338;10.144.162.225;
R4503;10.144.113.1;
R6213;10.144.78.97;
R1098;10.144.137.33;
R1030;10.144.89.161;
R4591;10.144.136.193;
R6511;10.144.120.225;
R7573;10.144.161.241;
R7253;10.144.162.81;
R4051;10.144.110.1;
R1051;10.136.59.225;
Vielen Dank
Christian
ich habe ein Problem bei der automatischen Abarbeitung folgenden Problems:
In einer semikolon-getrennten csv-Datei mit Netzwerkomponenten stehen deren IDs sowie im
Idealfall zwei IP-Adressen.
Leider ist der Idealfall relativ selten.
In dem ersten IP-Adressfeld sollen ausschließlich IP-Adressen stehen, deren 2. Oktett
größergleich 144 ist. Bei den IPs, bei denen dies nicht der Fall ist, steht in der Regel im
2. Oktett eine 136. Diese IPs sollen in das Feld IP2 kopiert werden. Ausserdem soll in IP1
die Umrechnung dieser Adresse nach folgendem Muster erfolgen:
10.(136+8).(3.Oktett+16).(4.Oktett)
Hier nun noch ein Auszug aus dieser Datei:
Search code;IP Address;IP Adresse 2
TESTCI;10.145.19.101;
R6504;10.144.79.33;
R88001;10.144.187.209;
R7436;10.144.181.49;
R7435;10.144.182.177;
R6189;10.136.43.97;10.144.75.97
R7391;10.144.161.49;
R7344;10.144.178.161;
R7338;10.144.162.225;
R4503;10.144.113.1;
R6213;10.144.78.97;
R1098;10.144.137.33;
R1030;10.144.89.161;
R4591;10.144.136.193;
R6511;10.144.120.225;
R7573;10.144.161.241;
R7253;10.144.162.81;
R4051;10.144.110.1;
R1051;10.136.59.225;
Vielen Dank
Christian
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 38266
Url: https://administrator.de/contentid/38266
Ausgedruckt am: 05.11.2024 um 07:11 Uhr
9 Kommentare
Neuester Kommentar
hallo,
ich denk mal in perl müsste das relativ einfach zu lösen sein oder bist du auf batch/shell angewiesen??
mfg godlike P
ich denk mal in perl müsste das relativ einfach zu lösen sein oder bist du auf batch/shell angewiesen??
mfg godlike P
kann dir ja helfen wennde willst.
mfg
mfg
Hallo,
so vielleicht en Ansatz mit dem du weiterkommst:
zuerst loopst du über deine CSV-Datei.
Im Label testme wird die erste IP in 4 Blöcke zerlegt und in einzelne Variablen gepackt.
Der C-Block der 2. IP wird berechnet.
Den 2. Block von der ersten IP prüfst du, ob er 144 ist, wenn ja, bisbst du alle Zeilen aus.
Falls du alles in einer Datei brauchst, leitest du die Ausgabe in eine Datei mit ">>" um.
Viele Grüsse
-= Axel =-
so vielleicht en Ansatz mit dem du weiterkommst:
@echo off
set csvfile=ips.csv
for /F "tokens=1,2,3 delims=;" %%a in (%csvfile%) do call :testme %%a %%b %%c
pause
goto end
:testme
set name=%1
set ip1=%2
set ip2=%3
set ip1_A=
set ip1_B=
set ip1_C=
set ip1_D=
for /F "tokens=1-4 delims=." %%j in ('echo %ip1%') do (set ip1_A=%%j&& set ip1_B=%%k&& set ip1_C=%%l&& set ip1_D=%%m)
set /a ip2_C=%ip1_C%+16
if "%ip1_B%"=="144" (echo %name%;%ip1%;10.144.%ip2_C%.%ip1_D%) else echo ERROR %name% - 2. Oktett in %ip1% ist nicht 144
goto end
:end
zuerst loopst du über deine CSV-Datei.
Im Label testme wird die erste IP in 4 Blöcke zerlegt und in einzelne Variablen gepackt.
Der C-Block der 2. IP wird berechnet.
Den 2. Block von der ersten IP prüfst du, ob er 144 ist, wenn ja, bisbst du alle Zeilen aus.
Falls du alles in einer Datei brauchst, leitest du die Ausgabe in eine Datei mit ">>" um.
Viele Grüsse
-= Axel =-
Moin eu_admin,
aus Spass nochmal eine etwas kompaktere Alternativ-Batchlösung.
In der Praxis würde ich aber eine etwas lesbarere (wie die von AxelHahn) vorziehen.
Nur um zu zeigen, dass es auch etwas kürzer geht..
Output auf Konsole/im 2 Schritt in neue Datei SortIps.csv:
Gruß
Biber
aus Spass nochmal eine etwas kompaktere Alternativ-Batchlösung.
In der Praxis würde ich aber eine etwas lesbarere (wie die von AxelHahn) vorziehen.
Nur um zu zeigen, dass es auch etwas kürzer geht..
::----sortIps.bat ------ Parameter1= Name der CSV-Datei
@echo off & setlocal enableDelayedExpansion
(set /p header=<%1) && @echo !header!
For /f "skip=1 delims=; tokens=1-3" %%i in (%1) do (
if [%%k] Neq ( @If %%k GTR %%j (echo %%i;%%k;%%j) else echo %%i;%%j;%%k;) Else (
For /f "tokens=1-4 delims=." %%a in ("%%j") do (
IF %%b GEQ 144 ( echo %%i;%%a.%%b.%%c.%%d;) Else (
(Set /a x=%%b+8) && (Set /a y=%%c+16) && (Echo %%i;%%a.!x!.!y!.%%b;%%a.%%b.%%c.%%d;
)))))
$cmd$sortips ips.csv
Search code;IP Address;IP Adresse 2
TESTCI;10.145.19.101;
R6504;10.144.79.33;
R88001;10.144.187.209;
R7436;10.144.181.49;
R7435;10.144.182.177;
R6189;10.144.75.97;10.136.43.97
R7391;10.144.161.49;
R7344;10.144.178.161;
R7338;10.144.162.225;
R4503;10.144.113.1;
R6213;10.144.78.97;
R1098;10.144.137.33;
R1030;10.144.89.161;
R4591;10.144.136.193;
R6511;10.144.120.225;
R7573;10.144.161.241;
R7253;10.144.162.81;
R4051;10.144.110.1;
R1051;10.144.75.136;10.136.59.225;
$cmd$sortips ips.csv >sortIps.csv
Gruß
Biber
Moin eu_admin,
bei meinem Script kannst Du dann den Aufruf ändern von:
...in...
...aber erst, wenn es ausgiebig getestet ist
Ich würde auf jeden Fall die Ur-Datei ips.csv nur lesen und in eine andere Datei schreiben.
Gruß
Biber
bei meinem Script kannst Du dann den Aufruf ändern von:
sortips ips.csv >sortIps.csv
sortips ips.csv >sortIps.csv
Copy /y sortIps.csv Ips.csv
...aber erst, wenn es ausgiebig getestet ist
Ich würde auf jeden Fall die Ur-Datei ips.csv nur lesen und in eine andere Datei schreiben.
Gruß
Biber
Moin eu_admin,
noch mal eine Verfeinerung mehr auf dem Weg zu Deiner Lösung.
Wenn die gesammelten Anforderungen jetzt so aussehen:
1. IPs im Bereich 10.145.xxx.xxx soll keine Änderung vorgenommen werden. Die IP2 soll gleich der IP1 sein.
2. IPs im Bereich 10.144.xxx.xxx soll die Original-IP in IP1 gesetzt werden und das ausgerechnete Equivalent in IP2 gesetzt werden
3. Wenn IP1 im Bereich 10.136.xxx.xxx liegt, soll die IP1 auf die ausgerechnete 10.144.xxx.xxx-Adresse gesetzt werden und dier ursprüngliche IP1 in IP2 kopiert werden.
Letztendlich soll die "große" IP immer in IP1 sein.
Dann macht dieser Schnipsel....
dieses Ergebnis:
Allerdings ist noch offen, was passieren soll, wenn das 2. Ip-Oktett weder 145 noch 144 noch 136 ist... im Moment fällt es einfach weg.
Gruß
Biber
noch mal eine Verfeinerung mehr auf dem Weg zu Deiner Lösung.
Wenn die gesammelten Anforderungen jetzt so aussehen:
1. IPs im Bereich 10.145.xxx.xxx soll keine Änderung vorgenommen werden. Die IP2 soll gleich der IP1 sein.
2. IPs im Bereich 10.144.xxx.xxx soll die Original-IP in IP1 gesetzt werden und das ausgerechnete Equivalent in IP2 gesetzt werden
3. Wenn IP1 im Bereich 10.136.xxx.xxx liegt, soll die IP1 auf die ausgerechnete 10.144.xxx.xxx-Adresse gesetzt werden und dier ursprüngliche IP1 in IP2 kopiert werden.
Letztendlich soll die "große" IP immer in IP1 sein.
Dann macht dieser Schnipsel....
::-------snipp Sortips2.bat
@echo off & setlocal enableDelayedExpansion & if [%1]== (echo Keine IP-Datei angegeben.) & goto :eof
(set /p header=<%1) && @echo !header!
For /f "skip=1 delims=; tokens=1-3" %%i in (%1) do (
if [%%k] Neq ( @If %%k GTR %%j (echo %%i;%%k;%%j) else echo %%i;%%j;%%k;) Else (
For /f "tokens=1-4 delims=." %%a in ("%%j") do (
IF %%b EQU 145 ( echo %%i;%%j;%%j) Else (
IF %%b EQU 144 ((Set /a x=%%b-8) && (Set /a y=%%c-16) && echo %%i;%%j;%%a.!x!.!y!.%%d;) Else (
IF %%b EQU 136 ((Set /a x=%%b+8) && (Set /a y=%%c+16) && Echo %%i;%%a.!x!.!y!.%%d;%%j))))))
::-------snapp Sortips2.bat
sortips2 ips.txt
Search code;IP Address;IP Adresse 2
TESTCI;10.145.19.101;10.145.19.101
R6504;10.144.79.33;10.136.63.33;
R88001;10.144.187.209;10.136.171.209;
R7436;10.144.181.49;10.136.165.49;
R7435;10.144.182.177;10.136.166.177;
R6189;10.144.75.97;10.136.43.97
R7391;10.144.161.49;10.136.145.49;
R7344;10.144.178.161;10.136.162.161;
R7338;10.144.162.225;10.136.146.225;
R4503;10.144.113.1;10.136.97.1;
R6213;10.144.78.97;10.136.62.97;
R1098;10.144.137.33;10.136.121.33;
R1030;10.144.89.161;10.136.73.161;
R4591;10.144.136.193;10.136.120.193;
R6511;10.144.120.225;10.136.104.225;
R7573;10.144.161.241;10.136.145.241;
R7253;10.144.162.81;10.136.146.81;
R4051;10.144.110.1;10.136.94.1;
R1051;10.144.75.225;10.136.59.225
Allerdings ist noch offen, was passieren soll, wenn das 2. Ip-Oktett weder 145 noch 144 noch 136 ist... im Moment fällt es einfach weg.
Gruß
Biber