Bash/AWK Wyłuskiwanie zmiennej frazy z tekstu

Problemy dotyczące programowania.

Moderatorzy: Moderatorzy, Administratorzy

Kean
Użytkownik
Posty: 79
Rejestracja: 2005-12-06, 21:33

Bash/AWK Wyłuskiwanie zmiennej frazy z tekstu

Post autor: Kean »

Mam taki problem:
Potrzebuję wyłuskać z ciągu np: http://www.wp.pl domenę, czyli wp.pl. Dodatkowo ciąg wejściowy jest zmienny, czyli mogę mieć na przykład http://www.wp.pl, ftp.wp.pl lub samo wp.pl. Za każdym razem, jako efekt działania skryptu chcę uzyskać "wp.pl".
Żeby nie było za prosto, przyrostek domenowy składa się jak wiadomo z 2, 3 a nawet 4 znaków (pl, com, info).
Jedyną stałą jest ".".
Reasumując potrzebuję sczytać ciąg teksu do 2 kropki od końca (z jej wyłączeniem) (może zdarzyć się tak że będzie tylko 1 kropka, np w adresie wp.pl).

Macie pomysł jak to zrobić?

Może paść pytanie do czego mi to.
Mam zamiar zrobić bardzo prosty analizator loga named'a. Chcę wiedzieć jakie domeny są odwiedzane najczęściej i na podstawie tej wiedzy dokonywać pewnych optymalizacji w mojej sieci.
Możliwe że istnieje już taki analizator. Jeśli znacie jego nazwę to poproszę :)
kesay
Użytkownik
Posty: 29
Rejestracja: 2010-06-26, 13:06
Kontakt:

Re: Bash/AWK Wyłuskiwanie zmiennej frazy z tekstu

Post autor: kesay »

Witam

Mamy nowy rok, więc będę dobry i rzucę gotowcem ;)

Kod: Zaznacz cały

#!/bin/bash                                                                                                                      
data=('http://www.poczta.wp.pl' 'http://www.wp.pl' 'www.poczta.wp.pl' 'www.wp.pl' 'wp.pl' 'http://www.poczta.wp.pl?id=123' 'http://wp.pl?id=123' 'www.poczta.wp.pl?id=123' 'www.wp.pl?id=123' 'wp.pl?id=123') 
 
for l in "${data[@]}"
do
  echo -en "${l}\t"
  echo ${l} | sed 's@\(.*//\)\?\(.*\.\)\?\([^\./]*\.[^\.?]*\)\(?.*\)\?$@\3@'
done
Output skryptu:

Kod: Zaznacz cały

http://www.poczta.wp.pl wp.pl
http://www.wp.pl        wp.pl
www.poczta.wp.pl        wp.pl
www.wp.pl       wp.pl
wp.pl   wp.pl
http://www.poczta.wp.pl?id=123  wp.pl
http://wp.pl?id=123     wp.pl
www.poczta.wp.pl?id=123 wp.pl
www.wp.pl?id=123        wp.pl
wp.pl?id=123    wp.pl
Chyba taki efekt chciałeś uzyskać. Jednak, znajdź trochę czasu i przeanalizuj sobie ten kod. Poczytaj też o wyrażeniach regularnych.

BTW. Czy tylko mnie wkurza konieczność escapeowania nawiasów oraz pytajnika w wyr. reg. sed'a?

Pozdro,
Paweł
Awatar użytkownika
ondreyos
Użytkownik
Posty: 331
Rejestracja: 2007-11-01, 17:31
Lokalizacja: Poznań

Re: Bash/AWK Wyłuskiwanie zmiennej frazy z tekstu

Post autor: ondreyos »

No ok. a powiedz proszę (niestety, nie mam w tej chwili możliwości sprawdzić u siebie), jak się ten skrypt zachowa w wypadku domeny z "dwuczęściowym rozszerzeniem". np. zamień wp.pl na xxx.com.pl i podaj wynik.

Żeby była jasność - nie mówię, że to nie przejdzie - po prostu nie mam możliwości sprawdzić, a jestem ciekawy, czy przewidziałeś taką opcje.
kesay
Użytkownik
Posty: 29
Rejestracja: 2010-06-26, 13:06
Kontakt:

Re: Bash/AWK Wyłuskiwanie zmiennej frazy z tekstu

Post autor: kesay »

Przecież Ci napisałem wynik działania skryptu, masz tam m.in.:

Kod: Zaznacz cały

www.poczta.wp.pl        wp.pl
www.wp.pl       wp.pl
Czyli skrypt wyłuskuje tylko domeny, bez subdomen. Tobie chodziło o poieranie również subdomen?
Kean
Użytkownik
Posty: 79
Rejestracja: 2005-12-06, 21:33

Re: Bash/AWK Wyłuskiwanie zmiennej frazy z tekstu

Post autor: Kean »

Wielkie dzięki. Musze się zaznajomić dokładnie z komendą sed :)
ondreyos miał ma myśli domendę com.pl (czyli coś takiego jak samodzielne pl, eu, com, org).
Przykład www.abc.com.pl <- w tm przypadku domena to abc.com.pl.
Awatar użytkownika
ondreyos
Użytkownik
Posty: 331
Rejestracja: 2007-11-01, 17:31
Lokalizacja: Poznań

Re: Bash/AWK Wyłuskiwanie zmiennej frazy z tekstu

Post autor: ondreyos »

Kean - zgadza się.

Jak pisałem wcześniej - nie mam możliwości przetestowania w tej chwili podanego skrytpu, ale w dużym skrócie wygląda to na to, że obcina (jeśli występuje) część po znaku zapytania, a następnie zwraca ostatni segment, kropkę i segment przed kropką.

W takim razie podejrzewam, ze dla domeny poczta.abc.com.pl, zamiast abc.com.pl, zwróci com.pl - i o sprawdzenie takiego wariantu prosiłem/sugerowałem. Nie pytałem o subdomeny, ale sytuację, gdy powinien zwrócić 3 skladniki oddzielone dwoma kropkami, zamiast standardowego zestawu COŚ kropka COŚ.
kesay
Użytkownik
Posty: 29
Rejestracja: 2010-06-26, 13:06
Kontakt:

Re: Bash/AWK Wyłuskiwanie zmiennej frazy z tekstu

Post autor: kesay »

Aj.. coś nie możemy się dogadać ;)
ondreyos pisze:W takim razie podejrzewam, ze dla domeny poczta.abc.com.pl, zamiast abc.com.pl, zwróci com.pl
Nie inaczej. Tak właśnie będzie. Dokładnie tak zrozumiałem prośbę Autora wątku. Patrz:
Kean pisze:przykład http://www.wp.pl, ftp.wp.pl lub samo wp.pl. Za każdym razem, jako efekt działania skryptu chcę uzyskać "wp.pl".
Kean, więc w końcu jak skrypt ma działać? :)
sp7foy
Użytkownik
Posty: 167
Rejestracja: 2008-02-26, 15:07
Lokalizacja: Skierniewice

Re: Bash/AWK Wyłuskiwanie zmiennej frazy z tekstu

Post autor: sp7foy »

kesay pisze:Kean, więc w końcu jak skrypt ma działać? :)
Pisał o domenie. Ja rozumiem, że chodzi mu o wyświetlenie wszystkiego po pierwszej kropce.
Ale jednocześnie bez śmieci na końcu (tak jak w tej chwili).
Kean
Użytkownik
Posty: 79
Rejestracja: 2005-12-06, 21:33

Re: Bash/AWK Wyłuskiwanie zmiennej frazy z tekstu

Post autor: Kean »

kesay, generalnie jest ok. Zapomniałem o domenach dwu składnikowych, typu com.pl i wroc.pl. Jednakże takich domen jest stosunkowo mało i jest to w moim wypadku do zaniedbania. Aby je obsłużyć, trzeba by dodać do skryptu parę caseów i wklepać takie "rodzynki" na sztywno.
Awatar użytkownika
ondreyos
Użytkownik
Posty: 331
Rejestracja: 2007-11-01, 17:31
Lokalizacja: Poznań

Re: Bash/AWK Wyłuskiwanie zmiennej frazy z tekstu

Post autor: ondreyos »

W ogóle moja pierwsza myśl była właśnie, żeby do jakiegoś pliku/bazy wrzucić istniejące domeny (jedno i dwuczęściowe), a następnie wyszukiwać domeny na liście. Potem uznałem, że przekombinowane i w ogóle - ale widzę, że mój pomysł powraca :D:D
ODPOWIEDZ