Loading [MathJax]/extensions/tex2jax.js
Ask Your Question
2

Selftest 3: počítání klientů (2.díl)

asked Dec 8 '15

JanVoz gravatar image

Ahoj,
pokořil jsem progtest na 100%, ale je mi jasné, že ten skript je naprostá prasárna.
Měl bych několik otázek, pokud by se našel někdo, kdo by poradil, byl bych velice vděčný. :)

1) Nepřišel jsem na lepší způsob, jak řešit grep pro dva různé případy a pak je spojit. Regexy příliš neovládám, ale přijde mi, že by to stejně nešlo. Možná tak v AWK?

2) Řazení si myslím mám v pořádku, ale najití nejvyššího počet výskytů půjde přes AWK nějak elegantněji, minimálně by příkaz pro najití maxima a vypsání ip adres mohl být v jednom AWK, bohužel se mi to tam nepodařilo (z neznalosti) nacpat. Přes BEGIN a příkaz mi to neprošlo... příkaz a END zase vypíše jen poslední IP adresu. Má někdo lepší nápad?

Ošklivý, ale funkční kód:

error=`cat apache.log | grep '\[error\]' | awk '{print $13}' | cut -f1 -d"]"`
obyc=`cat apache.log | grep -v '\[error\]' | awk '{print $6}'`
ips=$obyc`echo -e "\n$error"`
ipsseradit=`echo "$ips" | sort -n | uniq -c | sort -k1,1n | awk '{print $1" "$2}'`
pocet=`echo "$ipsseradit" | awk '{if($1>max){max=$1}} END {print max}'`
echo "$ipsseradit" | awk -v var=$pocet '{if ($1==var){print $2}}' | sort -t. -k1,1n -k2,2n -k3,3n -k4,4n
add a comment

1 Answer

Sort by » oldest newest most voted
1

answered Dec 9 '15

Josef Kokeš gravatar image

updated Dec 9 '15

VojtechMyslivec gravatar image

1) Grep umí použít několik vyhledávacích výrazů pomocí parametru -e (ne na Frayi), ale moc to nepomůže, pokud cílové výstupy jsou na různých sloupcích. Pak by to chtělo buď sed (nepříjemně pracné) nebo awk (něco jako awk '{ if ($3 == "[Error]") print $13; else print $6; }' - čísla zcela náhodně, neznám zadání; pokud nejde použít obsah sloupečku a je nutné použít regexp, tak ... if ($3 ~ /vyraz/) ...).

2) Vizte řešení od Marka Bartíka, počítá tam maximum v awk.

link

Comments

Na Frayi sice nejde grep -e, ale k tomu tam je egrep nebo ggrep -e (ggrep = gnugrep)

Marek Bartík (Dec 10 '15)

Už je to trochu krásnější, ale pořád se mi nepodařilo dát do jednoho awk najití maxima a pak ještě porovnání a vypsání té adresy. Ten příklad na askfitu na maxim jsem úplně nopochopil, jak by mi pomohl :/ Jak mám použít získanou proměnou max v prvním awk, aby mi awkčko proběhlo ještě jednou a již s ní pracovalo? Dík :)

filtr=`cat apache.log | awk '{if ($11=="[error]") print $13; else print $6}' | sed 's/]//g' | sort | uniq -c`
maximum=`echo "$filtr" | awk '{if($1>max){max=$1;}} END {print max;}'`
echo "$filtr" | awk -v var=$maximum '{if($1==var){print $2}}' | sort -t. -k1,1n -k2,2n -k3,3n -k4,4n

JanVoz (Dec 16 '15)

Uprav si ten komentář, prosím. Jde o to, že tobě stačí si ten soubor projet celý jen jednou. A pak v sekci END si for cyklem projet naukládané hodnoty a vypsat je, popř. s nimi dělat něco jiného. Tuhle druhou úlohu mám na jeden awk a pajpou do sortu, nic víc. Dá se to napsat i na jedno awk, ale je to už fakt prasárna :)

Marek Bartík (Dec 16 '15)

Je to jen rozšíření toho awk z minulé úlohy Pseudokód: Nastavit maximum na něco Podle toho, jestli je řádka error nebo ne, vyber příslušný sloupec Hodnota sloupce (IP adresa) je klíč v asociativním poli, navyš hodnotu pole o 1 (a[$13]++) Pokud je tato nově navýšená hodnota větší než prozatimní maximum, nastav maximum na novou hodnotu a poznamenej si IP adresu do nějakého dalšího pole) Pokud je tato nově navýšená hodnota stejná jako maximum, poznamenej si IP adresu Pokud je tato nově navýšená hodnota menší než maximum, pokračuj na další řádek Po zpracování všech řádků mi vypiš pole IP adres v pomocném poli Takhle jsem to nedělal. Uložil jsem si vždy jen maximum a na konci v END jsem projel forem celé asociativní pole a vypsal ty hodnoty pole pro něž platí a[IP]==max then print IP

Marek Bartík (Dec 16 '15)

Jasný, díky za komentář. Už to chápu :) Děkuju za pomoc :)

JanVoz (Dec 16 '15)
add a comment

Your answer

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!

Add answer

[hide preview]

Question tools

Follow
1 follower

Stats

Asked: Dec 8 '15

Seen: 361 times

Last updated: Dec 09 '15