Strona 1 z 1

[SOLVED] [AWK] Jak przetworzyć poprawnie url

: 05 gru 2013, 01:32
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.

Re: [AWK] Jak przetworzyć poprawnie url

: 05 gru 2013, 01:48
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:

Re: [AWK] Jak przetworzyć poprawnie url

: 05 gru 2013, 08:44
autor: Mały 1
Napisz jaki chcesz otrzymać wynik z powyższego adresu.

Re: [AWK] Jak przetworzyć poprawnie url

: 05 gru 2013, 19:11
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

Re: [AWK] Jak przetworzyć poprawnie url

: 05 gru 2013, 19:34
autor: ethanak
Nie mów że nie masz perla zainstalowanego...

Re: [AWK] Jak przetworzyć poprawnie url

: 05 gru 2013, 19:45
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.

Re: [AWK] Jak przetworzyć poprawnie url

: 05 gru 2013, 19:50
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).

Re: [AWK] Jak przetworzyć poprawnie url

: 05 gru 2013, 21:09
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.

Re: [AWK] Jak przetworzyć poprawnie url

: 05 gru 2013, 21:11
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:

Re: [AWK] Jak przetworzyć poprawnie url

: 06 gru 2013, 07:05
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...

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

: 06 gru 2013, 12:08
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"

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

: 06 gru 2013, 12:11
autor: ethanak
jesteś pewien? bo chyba akurat błędnych wyników kolega wątkotwórca chciał się pozbyć?

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

: 06 gru 2013, 12:36
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ł.

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

: 06 gru 2013, 12:46
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?

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

: 06 gru 2013, 12:58
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?

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

: 06 gru 2013, 13:14
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?

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

: 06 gru 2013, 14:11
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$

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

: 06 gru 2013, 14:32
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.

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

: 06 gru 2013, 20:25
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