Formatowanie adresów IP

Odpowiedz Nowy wątek
2019-03-14 11:45
0

Cześć. Jestem w miarę świeży w pythonie i natknąłem się na problem, który jest dość ciężki dla mnie do rozwiązania.
Potrzebuję wyświetlić na ekranie listę wolnych adresów IP. Jest pewien skrypt (list.sh), który wyświetla zajęte adresy i będę musiał go uruchamiać w Pythonie.. Jego output wygląda następująco:

192.168.194.174 192.168.194.173 [xxx1]      
192.168.194.178 192.168.194.177 [xxx2]      
192.168.194.182 192.168.194.181 [xxx3]      
192.168.194.186 192.168.194.185 [xxx4]      
192.168.194.194 192.168.194.193 [xxx5]      

Jak widać wyżej zajęte adresy zostały wylistowane. Adresy IP są zawsze +2. W związku z tym wypisałem teraz ręcznie wolne adresy:

192.168.194.176
192.168.194.180
192.168.194.184
192.168.194.188
192.168.194.190
192.168.194.192

Jak zrobić, żeby output wylistował mi wolne adresy nie będące na pierwszej liście?
Jest to moja pierwsza styczność z przetwarzaniem tego typu danych w Pythonie.

edytowany 5x, ostatnio: debek, 2019-03-14 11:48

Pozostało 580 znaków

2019-03-14 12:17
1

1) Zapisujesz wynik polecenia list.sh jako jeden string. W aktualnej wersji Pythona zaleca się stosować polecenie subprocess.run() ( https://docs.python.org/3/lib[...]l#using-the-subprocess-module ), żeby pobrać dane zwracane przez komendę.

>>> import subprocess
>>> result = subprocess.run(['sh', 'list.sh'], stdout=subprocess.PIPE)
>>> result.stdout

2) Wykonujesz na tym stringu wyrażenie regularne zbierające wszystkie adresy IP. ( https://docs.python.org/3/library/re.html#re.findall )
3) Dla każdego adresu z Twojej listy wolnych adresów, sprawdzasz, czy jest równy dowolnemu adresowi w liście zwracanej przez wyrażenie regularne. Jeśli nie jest, to dodajesz do listy wynikowej.

edytowany 6x, ostatnio: Spine, 2019-03-14 12:24

Pozostało 580 znaków

2019-03-14 16:32

Pytanie zrozumiałem następująco: dysponujesz pulą adresów, z której chcesz wypisać wolne adresy.

Dla niewielkiej liczby adresów można utworzyć zbiór wszystkich adresów z puli oraz zbiór adresów zajętych i wypisać różnicę.

>>> {1, 2, 3, 4, 5} - {4, 2, 42}
{1, 3, 5}

>>> 

Zbiór adresów zajętych może zawierać śmieci ([xxx...]), zwykły split wystarczy.

>>> import subprocess

>>> proc = subprocess.run(
...     ['sh', 'list.sh'],
...     capture_output=True,
...     text=True,
... )

>>> set(proc.stdout.split())
{'192.168.194.173',
 '192.168.194.174',
 '192.168.194.177',
 ...
 '[xxx5]'}

>>> 

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0