Ask Your Question
2

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

asked 2015-12-09 00:38:57 +0100

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
edit retag flag offensive close delete

1 Answer

Sort by » oldest newest most voted
1

answered 2015-12-09 19:07:50 +0100

Josef Kokeš gravatar image

updated 2015-12-09 20:26:30 +0100

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.

edit flag offensive delete publish link more

Comments

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

Marek Bartík ( 2015-12-10 13:19:25 +0100 )edit

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 ( 2015-12-16 15:19:10 +0100 )edit

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 ( 2015-12-16 15:22:49 +0100 )edit

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 ( 2015-12-16 15:31:30 +0100 )edit

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

JanVoz ( 2015-12-16 15:50:10 +0100 )edit

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: 2015-12-09 00:38:57 +0100

Seen: 361 times

Last updated: Dec 09 '15