Wpis z mikrobloga

Są obecnie na sali jacyś użytkownicy linuxa? Mam sobie plik z logami ilości pobrań pewnego programu i musze z niego wyciągnąć liczbe pobrań każdej z wersji (osoby pobierające spod jednego IP liczymy tylko raz). Jak na moje oko to trzeba by pewnie zrobić grep z wyrażeniem regularnym i potem policzyć liczbe wierszy, tylko nadal mi brakuje jednego szczegółu. No bo to żaden problem jak ja sobię spiszę jakie tam wersje występują, walnę grep, jako wzorzec podam wyrażenie regularne opisujące wiersz w pliku z konkretną wersją i każę policzyć wiersze - i tak dla wszystkich wersji które sam znajdę. Ale jak zrobić to tak, żeby skrypt takie coś robił automatycznie? #informatyka #linux
  • 24
@ufos: Oczekuję że będziesz rozumieć tekst polski i przeczytasz dokładnie moja wypowiedź. Ale specjalnie dla Ciebie powtórzę, chcę się tylko dowiedzieć jak sprawić, żebym to nie ja musiał sprawdzić jakie wersje występują w pliku i dla nich wszystko wyszukiwać. Moim zdaniem istotnie różni się to od prośby o napisanie całego skryptu, jeśli Twoje dalsze wpisy mają tak wyglądać to proszę Cię, zajmij się czyms ciekawszym.

@almafater: Fragment wygląda tak: http://pastebin.com/RK7Drd2A
@anonim1133: Na razie załózmy że chodzi o linki. Zresztą to jeden pies czym są wersje, bo tutaj wystarczy tylko napisać i ewentualnie zmienić wyrażenie regularne, mnie chodzi o to jak je wszystkie wyszukać i dla kazdej z tych wersji sprawdzać liczbę pobrań. Kurczę, nie myślałem, że to sprawi taki problem, mam to na za godzinę, chyba dam sobie siana :S
@Marmite: użyj grep/sed/awk tak żeby mieć na wyjściu

<adres ip> <wersja>
Potem robisz

sort -u
, co niweluje powtarzające się wersje, potem możesz użyć

awk
żeby wywalić adresy ip i zrobić

sort | uniq -c
, co wypisze ilość ściągnięć każdej wersji.
@almafater: @anonim1133: Dobra, plan jest taki. Skanuję plik linia po linii, z linii wyciągam wzorzec i wpisuję go do jakiejś tablicy (przy okazji skanuję tablicę i sprawdzam czy wersja już w niej nie wystąpiła, jeśli wystąpiła to nie wpisuję). I potem dla każdego elementu wywołuje grep i liczę liczbę linii. Złożoność cienka, jeszcze trzeba by tu dodać coś o tym IP, ale na razie pytanie czy tego, co przedstawiłem, nie
@ufos: Heh, nie, nie szukam jelenia który to za mnie zrobi, szukam kogoś kto pomoże mi rozwiązać pewne niedostatki mojej wiedzy. Pisząc "użyj

man bash
" marnujesz czas zarówno swój, na napisanie tego nic nie wnoszącego posta, jak i mój, na przeczytanie rzeczy które w żadnym stopniu nie posuną mojej pracy dalej. Jeśli chcesz komuś pomagać to chociaż przeczytaj o co dana osoba prosi (ze zrozumieniem, to ważne) a nie rzucaj
@ufos: Jesteś albo wybitnie głupi, albo zupełnie odporny na to co się do Ciebie mówi. Skrypt chcę napisać sam, właśnie to robię, nie mam na niego pomysłu, podaję jakiś tam i pytam tylko czy da się go zrobić lepiej. I Twoim zdaniem to jest proszenie o napisanie skryptu. I'm out. Nie pisz już więcej, czuję że ta dyskusja mnie ogłupia.
@Marmite: w tym wypadku regex: "GET\s/mirror/ftp.cdlinux.pl/iso/(?P[^/]+)/" (składnia Pythonowa) powinien być wystarczający. Jeśli wersja może być zaszyta w innym miejscu, zrób prosty skrypt/cmdlet w Perl/Python/Awk znajdujący, wyciągający wersję i zwracający ją razem z IP (np. oddzielone spacją). Szczegóły w help/man/bing. ;)
@Asmodeusz: Regexy, jak już mówiłem, znam ;P chociaż linux twierdzi ze chyba jednak nie znam, wzorzec "[0-9]{2}.[0-9]{2}.[0-9]{2}.[0-9]{2}" (oczywiście backslashe są przed kropkami, tylko Wykop je wycina nie wiedzieć czemu) wcale nie chce wyciągać adresów IP typu "xx.xx.xx.xx" (a powinien). Dodawanie backslashy przed nawiasami klamrowymi zgodnie z tym co mam napisane w materiałach do przedmiotu nie pomaga. Mam 15 minut na napisanie tego, więc chyba sobie odpuszczę, skoro nawet z wyrażeniami regularnymi