[SOLVED] [AWK] Jak przetworzyć poprawnie url

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
adamski9000
Sędziwy Jeż
Sędziwy Jeż
Posty: 59
Rejestracja: 18 lis 2012, 16:05
Płeć: Mężczyzna
Wersja Ubuntu: 14.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

[SOLVED] [AWK] Jak przetworzyć poprawnie url

Post autor: adamski9000 »

Witam

Utknąłem na przetwarzaniu URL. Chciałbym wyselekcjonować z ciągu url wszystkie znaki pomiędzy q= a znakiem & Niby prosta sprawa, ale jednak nie do końca. Zastosowana poniżej formuła nie daje oczekiwanych rezultatów, gdyż selekcjonuje nie tylko od znaku q= ale także od znaków cp= oq= pq= . I jak ten problem rozwiązać ?

Kod: Zaznacz cały

url="https://www.google.pl/search?q=thunderbird&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:pl:official&client=firefox-a#hl=pl&gs_rn=2&gs_ri=serp&pq=outlook%202010&cp=14&gs_id=1eh&xhr=t&q=outlook+2010+chomikuj&es_nrs=true&pf=p&client=firefox-a&hs=HWE&tbo=d&rls=org.mozilla:pl%3Aofficial&sclient=psy-ab&oq=outlook+2010"

echo "$url" | awk 'BEGIN{FS="q="} { for (i=1; i<=NF; i++) print $i }'
Dziękuję i pozdrawiam
Adam

//bear7: Polecenia, wyniki poleceń, komunikaty, błędy, zawartość plików konfiguracyjnych oraz systemowych, na forum umieszczamy pomiędzy znacznikami CODE.
Ostatnio zmieniony 06 gru 2013, 19:56 przez adamski9000, łącznie zmieniany 1 raz.
Lenovo G580, Ubuntu 14.04, Detektyw Komputerowy dla Windows - OPEN SOURCE
Awatar użytkownika
jacekalex
Gibki Gibbon
Gibki Gibbon
Posty: 4707
Rejestracja: 17 cze 2007, 02:54
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: MATE
Architektura: x86_64

Re: [AWK] Jak przetworzyć poprawnie url

Post autor: jacekalex »

Czy to musi być awk?

Pytam, bo w perlu, funkcją split, to 30 sekund ciężkiej pracy. :rotfl:

Sznurek:
http://perlmeme.org/howtos/perlfunc/split_function.html

Pozdro
:craz:
Problemy rozwiązujemy na forum nie na PW -> Niech inni na tym skorzystają.
Komputer jest jak klimatyzacja - gdy otworzysz okna, robi się bezużyteczny...
Linux User #499936
Inny OS: Gentoo Linux :)
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

Re: [AWK] Jak przetworzyć poprawnie url

Post autor: Mały 1 »

Napisz jaki chcesz otrzymać wynik z powyższego adresu.
Awatar użytkownika
adamski9000
Sędziwy Jeż
Sędziwy Jeż
Posty: 59
Rejestracja: 18 lis 2012, 16:05
Płeć: Mężczyzna
Wersja Ubuntu: 14.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Re: [AWK] Jak przetworzyć poprawnie url

Post autor: adamski9000 »

Z powyższego adresu chciałbym otrzymać wszystkie ciągi zaczynające się od q= a kończące na $. Czyli:
thunderbird
outlook+2010+chomikuj
W zastosowanym skrypcie AWK dostaje natomiast wyniki wszystkich ciągów zawierających znaki q= łączonych razem z innymi znakiami, czyli także cp= oq= pq= a tego własnie nie chcę.

Jeśli w AWK będzie zbyt kłopotliwe to oczywiście użyje czegoś innego, jednakże instalować perla celem wykonania jednej funkcji, to chyba przerost formy nad treścią.

Pozdrawiam
Lenovo G580, Ubuntu 14.04, Detektyw Komputerowy dla Windows - OPEN SOURCE
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [AWK] Jak przetworzyć poprawnie url

Post autor: ethanak »

Nie mów że nie masz perla zainstalowanego...
Кто жопой родился, чижиком не помрёт
Awatar użytkownika
adamski9000
Sędziwy Jeż
Sędziwy Jeż
Posty: 59
Rejestracja: 18 lis 2012, 16:05
Płeć: Mężczyzna
Wersja Ubuntu: 14.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Re: [AWK] Jak przetworzyć poprawnie url

Post autor: adamski9000 »

Spróbowałem z perlem. Też ten sam problem.

Kod: Zaznacz cały

use strict;
use warnings;

  my $data = 'https://www.google.pl/search?q=thunderbird&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:pl:official&client=firefox-a#hl=pl&gs_rn=2&gs_ri=serp&pq=outlook%202010&cp=14&gs_id=1eh&xhr=t&q=outlook+2010+chomikuj&es_nrs=true&pf=p&client=firefox-a&hs=HWE&tbo=d&rls=org.mozilla:pl%3Aofficial&sclient=psy-ab&oq=outlook+2010';

  my @values = split('q=', $data);

  foreach my $val (@values) {
    print "$val\n";
  }
Wynika z tego, iż trzeba pokombinować z wyrażeniami regularnymi.
Lenovo G580, Ubuntu 14.04, Detektyw Komputerowy dla Windows - OPEN SOURCE
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [AWK] Jak przetworzyć poprawnie url

Post autor: ethanak »

Czemu się upierasz jak muł aby robić splita po 'q='? Czemu nie wyciągniesz z urla samego querystringa? Czemu nie potniesz po '&'?
I z żadnymi wyrażeniami regularnymi nie trzeba kombinować (chociaż to by akurat było najprostsze).
Кто жопой родился, чижиком не помрёт
Awatar użytkownika
adamski9000
Sędziwy Jeż
Sędziwy Jeż
Posty: 59
Rejestracja: 18 lis 2012, 16:05
Płeć: Mężczyzna
Wersja Ubuntu: 14.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Re: [AWK] Jak przetworzyć poprawnie url

Post autor: adamski9000 »

Dzięki, świetna sugestia ! Nie zwróciłem uwagi, iż znak & może być idealnym separatorem. To rozwiązuje problem.

Kod: Zaznacz cały

arr=(`echo $url | tr '&' ' '`)
for i in ${arr[*]}; 
do 
	[[ "${i:0:2}" == "q=" ]] && echo "$i"
done
Co dwie głowy to nie jedna ! Dzięki i pozdrawiam

//bear7: Polecenia, wyniki poleceń, komunikaty, zawartość plików konfiguracyjnych oraz systemowych, na forum umieszczamy pomiędzy znacznikami CODE.
Ostatnio zmieniony 05 gru 2013, 21:12 przez bear7, łącznie zmieniany 1 raz.
Powód: Dodanie znaczników CODE
Lenovo G580, Ubuntu 14.04, Detektyw Komputerowy dla Windows - OPEN SOURCE
Awatar użytkownika
jacekalex
Gibki Gibbon
Gibki Gibbon
Posty: 4707
Rejestracja: 17 cze 2007, 02:54
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: MATE
Architektura: x86_64

Re: [AWK] Jak przetworzyć poprawnie url

Post autor: jacekalex »

Ja tam pociąłem splitem. i mam taki wynik:

Kod: Zaznacz cały

 ~> perl split.pl 
https://www.google.pl/search?q=thunderbird
ie=utf-8
oe=utf-8
aq=t
rls=org.mozilla:pl:official
client=firefox-a#hl=pl
gs_rn=2
gs_ri=serp
pq=outlook%202010
cp=14
gs_id=1eh
xhr=t
q=outlook+2010+chomikuj
es_nrs=true
pf=p
client=firefox-a
hs=HWE
tbo=d
rls=org.mozilla:pl%3Aofficial
sclient=psy-ab
oq=outlook+2010
teraz tylko delikatny regex, żeby wyciągnąć z tablicy utworzonej splitem potrzebne zmienne (identycznie jak w funkcji vimeo poniżej), a ze zmiennymi można sobie zrobić, co się człowiekowi żywnie podoba. :rotfl:

Kod: Zaznacz cały

sub vimeo {
	
	my  @opcjejakosci = ("hd" , "sd" , "mobile");

	my $goto = $_[0] ;
	
	my $sygnatura="";
	my $playerurl="";
	my $timestamp="";
	my $videoid="";
	my $vimqualities="";
	my $jakosc="";
	my $sznur="";
	my $adres="";
	

        my $sznurek = WWW::Mechanize->new();
	       $sznurek ->agent( "$useragent" );
           $sznurek->max_redirect(1);
           $sznurek->default_header('Accept' => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 
               'Accept-Language' => " pl-PL,pl;q=0.5",
               'Accept-Charset' => "ISO-8859-2,utf-8;q=0.7,*;q=0.7",
               'Accept-Encoding' => "gzip,deflate",
               'Connection' => "keep-alive", );
				$sznurek->get( $goto );
	   	my $vimtest = $sznurek->content();
        
        if ($vimtest =~m/\"signature":\"(.+?)\"/) {
	 		 $sygnatura = $1; }

        if ($vimtest =~m/\"player_url":\"(.+?)\"/) {
		     $playerurl=$1;  }
 

		if ($vimtest =~m/"timestamp":(\d+)/) {
			 $timestamp=$1; }

		if ($vimtest =~m/"video":\{"id":(\d+?),/) {
			 $videoid=$1; }

		if ($vimtest =~m/"qualities":\[(.*?)\]/) {
		     $vimqualities=$1; }

	
	  foreach  my $vimq (@opcjejakosci) {
       if ($vimqualities =~/$vimq/ ){
	   $jakosc = $vimq;
	   last; 
	   }
     }
			
	  $sznur = "http://$playerurl/play_redirect?quality=$jakosc&clip_id=$videoid&time=$timestamp&sig=$sygnatura";

        my $film =  WWW::Scripter->new(
				autocheck => 1,
 				show_progress => 1,);
  
    $film ->use_plugin(JavaScript => engine => "JE",);
    $film ->agent( "$useragent" );
    $film->max_redirect(0);

     $film->get($sznur);
        my $status = $film->status();
        if (($status >= 300) && ($status < 400)) {
        $adres = $film->response()->header('Location');
	}
   	my @vlcstart = ("$odtwarzacz  \"$adres\" 2>&1>/dev/null &" );
	exec @vlcstart   or print STDERR "couldn't exec $odtwarzacz: $!";
  
}
Pozdro
:craz:
Problemy rozwiązujemy na forum nie na PW -> Niech inni na tym skorzystają.
Komputer jest jak klimatyzacja - gdy otworzysz okna, robi się bezużyteczny...
Linux User #499936
Inny OS: Gentoo Linux :)
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [AWK] Jak przetworzyć poprawnie url

Post autor: ethanak »

adamski9000 pisze:Nie zwróciłem uwagi, iż znak & może być idealnym separatorem.
Chcesz powiedzieć, że zabrałeś się do analizy stringu nie znając zasad jego składni???
E... tego... pietruszka może... albo co...
Кто жопой родился, чижиком не помрёт
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

Re: [SOLVED] [AWK] Jak przetworzyć poprawnie url

Post autor: Mały 1 »

Najprościej będzie tak:

Kod: Zaznacz cały

awk -v RS='&' '/^.*q=/ { sub(/^.*q=/,""); print }' test
Wynik:

Kod: Zaznacz cały

thunderbird
t
outlook%202010
outlook+2010+chomikuj
outlook+2010"
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [SOLVED] [AWK] Jak przetworzyć poprawnie url

Post autor: ethanak »

jesteś pewien? bo chyba akurat błędnych wyników kolega wątkotwórca chciał się pozbyć?
Кто жопой родился, чижиком не помрёт
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

Re: [SOLVED] [AWK] Jak przetworzyć poprawnie url

Post autor: Mały 1 »

A w którym miejscu kolega napisał, że chcę się pozbyć błędnych wyników? Napisał tylko, że chce
adamski9000 pisze: Z powyższego adresu chciałbym otrzymać wszystkie ciągi zaczynające się od q= a kończące na $.
i takie rozwiązanie otrzymał.
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [SOLVED] [AWK] Jak przetworzyć poprawnie url

Post autor: ethanak »

w drugim poście wyraźnie napisał. poza tym jeśli kolega wątkotwórca nie bardzo potrafił sformułować pytanie nie znaczy to jeszcze, że widząc błąd musisz koniecznie się popisać i podać rozwiązanie co prawda spełniające (choć też nie do końca) warunki przedstawione w problemie - to i tak błędne.
czemu nie spełniające? a gdzie miałeś informację o tym, że substring ma się kończyć &, ale początek stringu jest dowolny?
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

Re: [SOLVED] [AWK] Jak przetworzyć poprawnie url

Post autor: Mały 1 »

ethanak pisze:a gdzie miałeś informację o tym, że substring ma się kończyć &, ale początek stringu jest dowolny?
adamski9000 pisze:Witam

Utknąłem na przetwarzaniu URL. Chciałbym wyselekcjonować z ciągu url wszystkie znaki pomiędzy q= a znakiem &
ethanak, od kiedy to masz wyłączność na udzielanie odpowiedzi?
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [SOLVED] [AWK] Jak przetworzyć poprawnie url

Post autor: ethanak »

nie mam wyłączności ale nie lubię, jeśli ktoś przedstawia tzw. rozwiązania analne.
jeśli jako programista nie zorientowałeś się że problem tkwi w błędnych założeniach - zastanów się nad straganem z pietruszką.
jeśli się zorientowałeś, ale zamiast ów błąd pokazać demonstrujesz błędne (mimo zgodności z pytaniem) rozwiązanie - cóż, wspominałem coś na temat ozdób do kontusza.

-- 06 gru 2013 14:17 --

tak przy okazji: pokażesz prawidłowe rozwiązanie?
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

Re: [SOLVED] [AWK] Jak przetworzyć poprawnie url

Post autor: Mały 1 »

To jaki chcesz wynik? Może taki:

Kod: Zaznacz cały

userpc@userpc:~/Desktop$ awk -v RS='&' '/^q=|[?]q=/ { sub(/^.*q=/,""); print }' a
thunderbird
outlook+2010+chomikuj
userpc@userpc:~/Desktop$
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [SOLVED] [AWK] Jak przetworzyć poprawnie url

Post autor: ethanak »

wynik jest prawidłowy, natomiast rozwiązanie dalej analne.
nie chce mi się dyskutować dlaczego - jako programista sam to powinieneś wiedzieć.
EOT z mojej strony.
Кто жопой родился, чижиком не помрёт
Awatar użytkownika
adamski9000
Sędziwy Jeż
Sędziwy Jeż
Posty: 59
Rejestracja: 18 lis 2012, 16:05
Płeć: Mężczyzna
Wersja Ubuntu: 14.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Re: [SOLVED] [AWK] Jak przetworzyć poprawnie url

Post autor: adamski9000 »

Panowie, dyskusja przestaje być merytoryczna.

Początkowo założyłem, iż selektor q= jest idealny i właściwie byłby, gdyby nie fakt, iż zamiast wyników z q= dostałem jeszcze wyniki oq= pq= cp=. W związku z tą komplikacją, zastosowanie selektora & okazało się też rozwiązaniem skutecznym, choć wcale nie optymalnym, gdyż wyświetla na wyjściu więcej wyników niż byłoby pożądane.

Ethanak podałeś mi dobra sugestię co do rozwiązania problemu ( za co jestem wdzięczny ) i problem został przez mnie rozwiązany, choć na pewno moje rozwiązanie nie jest ani super eleganckie ani idealne. Fakt faktem, w przeciwieństwie do Mały1 nie podałeś żadnych przykładów w kodzie, ograniczając się do ogólników.
Mały1 podałeś konkretnie rozwiązanie w kodzie którego oczekiwałem i za to też jestem wdzięczny.

Sądzę, iż temat można definitywnie zamknąć.

Pozdrawiam
Lenovo G580, Ubuntu 14.04, Detektyw Komputerowy dla Windows - OPEN SOURCE
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 15 gości