Talk: UNIX opgave Apache Access log

From Teknologisk videncenter
Revision as of 00:04, 29 August 2009 by Tcj (talk | contribs) (New page: == Her er så mit udkast == Jeg har forsøgt at strukturere scriptet mest muligt i små funktioner, så det er tydeligt, hvordan jeg har løst problemet. <source lang=bash> 1 #!/usr/bin/...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Her er så mit udkast

Jeg har forsøgt at strukturere scriptet mest muligt i små funktioner, så det er tydeligt, hvordan jeg har løst problemet.

  1 #!/usr/bin/bash
  2 
  3 ## Initial værdier
  4 #
  5 # Logfil
  6 LOGFIL=/tmp/httpd-access.log
  7 
  8 # Dato
  9 DD=`date`
 10 
 11 
 12 ## Programmet udskriver en rapport over de 50 mest aktive adresser
 13 ## Adresserne sorteres faldende.
 14 
 15 function dnslookup {
 16   ## Lav DNS lookup.
 17   #  input:  $1 = ipdresse
 18   #  output: dnsopslag
 19 
 20   dig -x $1 | grep PTR | grep -v -E '^;' | tr ' \t' ' '|cut -d' ' -f5
 21 }
 22 
 23 function overskrift {
 24   ## Udskriv sidetop
 25   #  input: $1 = dagsdato
 26   #  input: $2 = logfil start
 27   #  input: $3 = logfil slut
 28   #  output: tekst
 29   cat << HEADER
 30 HTTP Access rapport fra mars.tekkom.dk
 31 ======================================
 32  
 33  Rapporten genereret: $1
 34   
 35   ------------------------------------------------------------------------------------
 36   Data opsamlet er fra perioden den $2 til den $3
 37   ------------------------------------------------------------------------------------
 38 HEADER
 39 
 40 }
 41 
 42 function startdato {
 43   ## Find start dato i logfil
 44   #  input: $1 = filnavn
 45   #  output: dato som tekst
 46 
 47   head -n 1 /tmp/httpd-access.log | cut -d' ' -f4 | sed 's/[\[\/]/ /g' | sed 's/:/ /'
 48 }
 49 
 50 function slutdato {
 51   ## Find slut dato i logfil
 52   #  input: $1 = filnavn
 53   #  output: dato som tekst
 54   tail -n 1 /tmp/httpd-access.log | cut -d' ' -f4 | sed 's/[\[\/]/ /g' | sed 's/:/ /'
 55 
 56 }
 57 
 58 #######################
 59 ######## MAIN #########
 60 #######################
 61 
 62 # Findes logfilen så kører vi
 63 if ! [ -e $LOGFIL ] ; then
 64   exit 255
 65 fi
 66 
 67 # Lav en overskrift
 68 overskrift "$DD" "`startdato $LOGFIL`" "`slutdato $LOGFIL`"
 69 
 70 # Udskriv statistikken
 71 # forklaring paa oneliner:
 72 # cut -d' ' -f1 $LOGFIL : felt 1 er ipadressen på webclientn.
 73 # sort                  : før ipadresserne skal taelles skal de sorteres. uniq kræv
 74 #                         at listen er sorteret.
 75 # uniq -c               : sammentæl forkomster af unikke ip adresser
 76 # sort -rn              : sorter i omvendt rækkefølge og numerisk. sort sorterer default alfabeti
 77 # head -n 50            : ikke flere end 50
 78 # while read ...        : laver output og dnsopslag
 79 cut -d' ' -f1 $LOGFIL | sort | uniq -c | sort -nr | head -n 50 | \
 80                                                       while read cnt ip ; do \
 81                                                         echo -e "$cnt $ip \t(`dnslookup $ip`)"; \
 82                                                       done

--tcj 00:04, 29 August 2009 (CEST)