Žilvinas Sadauskas - Genialu tai, kas paprasta.

Apache logo custom statistika

Universitete gavau dar vieną užduotį, kurią atlikti reikėjo su bash. Reikėjo susigalvoti 5 statistikos pjūvius, kuriais būtų pateikiama tam tikra informacija. Kažkaip viską atidėliojau ir apie terminą sužinojau tik likus 4 valandoms iki jo pabaigos. Kaip bebūtų apmaudu scenarijų nusiunčiau pavėlavęs 20 minučių, todėl gavau nulį balų :) . Na, bet ne pasaulio pabaiga.

  1. #!/bin/bash
  2. clear
  3.  
  4. function help() {
  5. echo "Naudojimas: ./apache-stats.sh -f inputFile -s statistikos_id"
  6. echo "1 - visi unikalus ip"
  7. echo "2 - aktyviausiu desimtukas"
  8. echo "3 - gautu HTTP statusu sarasas ir kiekis"
  9. echo "4 - statistikos, esancios faile, periodas"
  10. echo "5 - populiariausia minute"
  11. }
  12.  
  13. # tikrinam ar visi raktai ir parametrai yra
  14. if [ $# -ne 4 ]; then
  15. help
  16. exit
  17. fi
  18.  
  19. if [ $1 == "-f" ]; then
  20. inputFile=$2;
  21. elif [ $3 == "-f" ]; then
  22. inputFile=$4;
  23. else
  24. help
  25. exit
  26. fi
  27.  
  28. # tikrinam ar failas egzistuoja
  29. if [ ! -e "$inputFile" ]; then
  30. echo "$inputFile neegzistuoja."
  31. exit
  32. #tikrinam ar readable
  33. elif [ ! -r "$inputFile" ]; then
  34. echo "$inputFile failas neturi read leidimu."
  35. exit
  36. #tikrinam ar ne direktorija $1
  37. elif [ ! -f "$inputFile" ]; then
  38. echo "$inputFile yra katalogas. Turi buti failas."
  39. exit
  40. fi
  41.  
  42. if [ $1 == "-s" ]; then
  43. stats_id=$2;
  44. elif [ $3 == "-s" ]; then
  45. stats_id=$4;
  46. else
  47. help
  48. exit;
  49. fi
  50.  
  51. # pasiimam apache logą ir nukerpam pirmą eilutę
  52. dataManip=`sed /newsyslog/d $inputFile`;
  53.  
  54. if [ $stats_id -eq 1 ]; then
  55. # ieskosim unikaliu ip
  56. echo "Unikalus IP"
  57. # awk print komanda sukapoja eilutę pagal tarpus ir paima pirmąjį stulpelį
  58. # sort surūšiuoja stulpelį
  59. # uniq išrenka tik unikalias eilutes. pastaba: prieš vykdant uniq būtina surūšiuoti eilutes,
  60. # nes kitu atveju uniq veikia nekorektiškai
  61. out=`echo "$dataManip" | awk ‘{print $1}’ | sort | uniq`
  62. echo "$out"
  63. elif [ $stats_id -eq 2 ]; then
  64. # aktyviausiu ip desimtukas
  65. echo "Kiekis | IP"
  66. # uniq raktas -c prideda vieną stulpelį, kuriam yra skaičius nurodantis, kiek kartų
  67. # kiekviena eilutė dubliavosi
  68. # sort -r raktas liepia surūšiuoti atvirkštine tvarka, raktas -g liepia rūšiuoti skaičius, taip
  69. # kaip juos rušiuoja žmonės, o ne pagal pirmą simbolį
  70. # head -n 10 paima pirmas 10 rezultato eilučių
  71. out=`echo "$dataManip" | awk ‘{print $1}’ | sort | uniq -c | sort -rg | head -n 10`
  72. echo "$out"
  73. elif [ $stats_id -eq 3 ]; then
  74. # pranesimai
  75. echo "Kiekis | HTTP kodas"
  76. # awk šioje vietoje bando įvykdyti regexp‘ą, kuris suskaldytų eilutę pagal kabutes.
  77. # nelabai korektiškai veikia, nes regexp’as man visada buvo tankus miškas
  78. # print $0 spausdina visą eilutę
  79. # print $6 spausdina prieš tai gauto rezultato šeštąjį stulpelį
  80. # visa kita jau aprašyta aukščiau
  81. out=`
  82. echo "$dataManip" | awk ‘{gsub(/"[^"]*"/,"",$0); print $0}’ | awk ‘{print $6}’ | sort | uniq -c | sort -rg | head -n 7
  83. `
  84. echo "$out"
  85. elif [ $stats_id -eq 4 ]; then
  86. # substr funkcija paima eilutę ir atkerpa dalį jos
  87. out=`
  88. echo "$dataManip" | awk ‘{print substr($4, 2, length($4)-1);}’ | sort
  89. `
  90. nuo=$(echo "$out" | head -n 1);
  91. # tail komanda paima tam tikra eilučių kiekį iš rezultatų pabaigos
  92. iki=$(echo "$out" | tail -n 1);
  93. echo "Statistika rodoma nuo $nuo iki $iki"
  94. elif [ $stats_id -eq 5 ]; then
  95. # kuria minute buvo jungtasi daugiausiai kartu
  96. # sed komanda suranda dvitaškius ir pakeičia juos tarpais, taip paruošdamas dirvą awk
  97. # komandai print
  98. echo "Kiekis | Minute"
  99. out=`
  100. echo "$dataManip" | awk ‘{print $4}’ | sed ’s/:/ /g’ | awk ‘{print $3}’ | sort -rg | uniq -c | head -n 1
  101. `
  102. echo "$out"
  103. fi

Na, ne perliukas, bet manau vis tiek kam nors bus naudinga.



9 Responses to “Apache logo custom statistika”

  1. kubikas::lt Says:

    ech tas Bukauskas ;-)

  2. Žilvinas Sadauskas Says:

    Aš sakyčiau griežtas, bet teisingas :) . Rašiau pas jį kursinį, viskas normaliai. Manau ir dėl bakalaurinio eisiu pas jį :)

  3. kubikas::lt Says:

    O tai tu pala 4akursis? :)

  4. Žilvinas Sadauskas Says:

    Jap. Neturėjau Unix’o 3-iam kurse, tai dabar pasirinkau :)

  5. kubikas::lt Says:

    Tai mes dar ir bendrakursiai reiškias :) et… aš dar univere šiais metais nebuvau… :(

  6. Žilvinas Sadauskas Says:

    Visai įmanoma. Aš tai po grupių išskirstymo trečiam kurse, net ne visus grupiokus pažįstu, o ką jau kalbėt apie kursiokus :D . Universitete irgi tik epizodiškai pasirodau, bet kadangi užduotis darau pats, tai gaunu ganėtinai daug. Šiaip esu patenkintas MIF’u, nors daug kas ir rėkia, kad lieva lieva, nieko neišmoko. Kas nenori mokytis, tas ir neišmoksta.

  7. kubikas::lt Says:

    Aš tiesa pasakius, vienas iš tų, kur nieko neišmokai :) praktiškai nieko naujo nepasakė :) viskam yra google. amen :)
    ps. tu kurioj grupėj? :)

  8. kubikas::lt Says:

    Beje pasiredaguok savo templeitus ale Single.php :-) dabar viršuj tas “Travelogue Entry” kažkaip keistas žiūrisi :)

  9. Žilvinas Sadauskas Says:

    Tai aišku viskas yra google, bet reikia sugalvot tai susirasti. O universitetas priverčia tave pasidomėt tam tikrais klausimais ir pasigilinti daugiau negu paviršutiniškai. Long live MIF. huray huray! :)

Leave a Reply

counter