2010-05-07 14 views
5

Mam plik dziennika zawierający niektóre wpisy Whois z względnymi adresami IP, które chcę cenzorować: 81.190.123.123 w 81.190.xxx.xxx.Jak cenzurować adresy IP w pliku za pomocą Pythona?

Czy istnieje sposób na dokonanie takiej konwersji i przepisanie zawartości pliku bez modyfikowania reszty?

Dziękuję za pomoc!

+2

Musisz użyć Pythona? Brzmi to bardziej jak zadanie dla "sed": przykład 'sed -E -e 's/([0-9] + \. [0-9] +) \. [0-9] + \. [0- 9] +/\ 1.xxx.xxx/g'' –

+0

to też jest świetne! niesamowite. Dziękuję Ci! – Julio

Odpowiedz

0

Jeśli Python nie jest rzeczywiście jednym z wymagań, to rozwiązuje również problem:

sed -i 's/\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)\.[0-9]\{1,3\}\.[0-9]\{1,3\}/\1.\2.xxx.xxx/g' mylogfile.log 

lub Perl, która pozwala pozbyć się większości brzydkie ukośniki:

perl -i -pe 's/(\d{1,3})\.(\d{1,3})\.\d{1,3}\.\d{1,3}/$1.$2.xxx.xxx/g' mylogfile.log 

Ale to nie ma flagi "w linii" -i.

+1

Perl rzeczywiście oferuje flagę "-i". –

+0

Oczywiście, że tak. Jeśli możesz o tym myśleć, Perl to ma. Powinienem był wiedzieć. – Thomas

3

Jak wspomniano powyżej, można to zrobić z sed:

sed -E -e 's/([0-9]+\.[0-9]+)\.[0-9]+\.[0-9]+/\1.xxx.xxx/g' 

ta wykorzystuje Dopasowanie wyrażenia regularnego szukać adresów IP i zastąpią ostatnie dwa oktety z xxx. Za pomocą przełącznika -i, można to zrobić wszystko na raz:

sed -i.bak -E -e 's/([0-9]+\.[0-9]+)\.[0-9]+\.[0-9]+/\1.xxx.xxx/g' file.txt 
+0

Te rozwiązania działają świetnie. Jedynym punktem jest to, że w tej samej linii mam inny ciąg, taki jak 192.168.xxx.xxx | ... i ta substytucja miażdży wcięcie przestrzeni. Czy istnieje inny sposób na sed, aby zastąpić wiele znaków spars (zamiast pojedynczego sparsować więcej niż jeden znak, jak "") z "\ t"? – Julio

+0

@Julio: Oczywiście, po prostu dodaj to do wyrażeń regularnych i tekstu zastępczego. –

0

Jeśli chcesz korzystać Python następnie użyć modułu fileinput przetworzyć linię plik lub pliki po linii.

import fileinput 
for line in fileinput.input(["filename"], inplace=1, backup='.bak'): 
    print processed(line) 
fileinput.close() 

fileinput z INPLACE = 1 będzie zmienić nazwę pliku wejściowego i odczytywane z pliku o zmienionej podczas kierowania stdout do nowego pliku o tej samej nazwie. Możesz użyć parametru kopii zapasowej, aby zapobiec automatycznemu usunięciu pliku tymczasowego.

Jeśli dane wejściowe są ważne, należy zachować ostrożność w obsłudze wyjątków, aby zapobiec utracie danych w przypadku wystąpienia błędu.

Powiązane problemy