Usuwanie linii w dokumencie tekstowym, które kończą się tak samo


0

Mamy skrypt, który pobiera listę domen do zablokowania naszego pola squid, ale nadal otrzymujemy ostrzeżenia w następujący sposób:

2015/03/02 17:08:47| WARNING: You should probably remove '.artnau.com' from the ACL named 'chat_domains'
2015/03/02 17:08:47| WARNING: '.artnau.com' is a subdomain of '.css.artnau.com'
2015/03/02 17:08:47| WARNING: because of this '.css.artnau.com' is ignored to keep splay tree searching predictable
2015/03/02 17:08:47| WARNING: You should probably remove '.artnau.com' from the ACL named 'chat_domains'
2015/03/02 17:08:47| WARNING: '.chatserve.com' is a subdomain of '.eagles.chatserve.com'
2015/03/02 17:08:47| WARNING: because of this '.eagles.chatserve.com' is ignored to keep splay tree searching predictable

Czy istnieje sposób na przejście przez plik i usunięcie subdomen z istniejących domen na liście?

Więc chwyć pierwszą linię i sprawdź, czy w tekście są jakieś inne linie kończące się tym tekstem i usuń go?


Czy możesz opublikować część pliku, w tym linie, które są ze sobą sprzeczne?
Tim

Jest to dokument tekstowy o długości 15 tys., Który wyświetla nazwy domen, które mają być blokowane przez squid. Oto link do pliku: pastebin.com/6mLB2KfZ
Andrew

Zasadniczo miałaby listę, taką jak: .artnau.com .css.artnau.com .chatserve.com .eagles.chatserve.com Byłoby wspaniale (na przykład) uzyskać .chatserve.com z listy i usunąć inne linie w tekście, które kończą się na .chatserve.com (ale zachowaj oryginalną linię)
Andrew

Odpowiedzi:


1

Oto jak to zrobić w Perlu:

$ cat a.txt
.artnau.com
.bar.foo.example.org
.chatserve.com
.css.artnau.com
.eagles.chatserve.com
.example.com
.foo.example.org
$ cat a.txt | perl -ne 'BEGIN { my %h; } $h{$_} = ""; END { foreach (keys %h) { $orig = $_; $_ =~ s/^\..*?\./\./; print $orig if not exists $h{$_} } }' | sort > b.txt
$ cat b.txt 
.artnau.com
.chatserve.com
.example.com
.foo.example.org

Jeden liner Perla przechodzi przez a.txt i dodawanie każdej linii do nazwy hash %h. Po dodaniu każdej linii pliku przechodzi on przez każdy klucz skrótu, usuwa pierwszą część domeny (pierwszy okres aż do drugiego okresu), a jeśli wynikowy ciąg nie znajduje się w skrócie, drukuje go. Wyjście jest następnie przesyłane przewodowo sort (możesz się domyślić, co to robi) i zapisać w b.txt.


Proszę wybaczyć mój brzydki Perl, jestem pewien, że istnieje bardziej eleganckie rozwiązanie.
Tim

The nieprzydatny cat jest bardziej obraźliwy.
tripleee

1
@ tripleee Więc jesteś bardziej dog osoba?
Tim

Dzięki za to ... czy jest jakiś sposób na samodzielne wykonanie akcji (bez tworzenia nowego pliku)?
Andrew

Ponadto muszę uruchomić to polecenie w każdym pliku o nazwie domena w drzewie katalogów ... Próbowałem find BL -name "domains" -print0 | xargs -0 -I file cat file | perl -ne 'BEGIN { my %h; } $h{$_} = ""; END { foreach (keys %h) { $orig = $_; $_ =~ s/^\..*?\./\./; print $orig if not exists $h{$_} } }' | sort > file2 ale dał mi jedną linię w pliku o nazwie plik2.
Andrew
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.