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.
Sznurek:
http://perlmeme.org/howtos/perlfunc/split_function.html
Pozdro

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.
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

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