Formatowanie adresów IP

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.

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/library/subprocess.html#using-the-subprocess-module ), żeby pobrać dane zwracane przez komendę.
>>> import subprocess
>>> result = subprocess.run(['sh', 'list.sh'], stdout=subprocess.PIPE)
>>> result.stdout
  1. Wykonujesz na tym stringu wyrażenie regularne zbierające wszystkie adresy IP. ( https://docs.python.org/3/library/re.html#re.findall )
  2. 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.
1

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]'}

>>> 

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