Difference between revisions of "Talk: UNIX opgave Apache Access log"
From Teknologisk videncenter
(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/...) |
m (→Her er så mit udkast) |
||
(4 intermediate revisions by 2 users not shown) | |||
Line 48: | Line 48: | ||
45 # output: dato som tekst | 45 # output: dato som tekst | ||
46 | 46 | ||
− | 47 head -n 1 | + | 47 head -n 1 $LOGFIL | cut -d' ' -f4 | sed 's/[\[\/]/ /g' | sed 's/:/ /' |
48 } | 48 } | ||
49 | 49 | ||
Line 55: | Line 55: | ||
52 # input: $1 = filnavn | 52 # input: $1 = filnavn | ||
53 # output: dato som tekst | 53 # output: dato som tekst | ||
− | 54 tail -n 1 | + | 54 tail -n 1 $LOGFIL | cut -d' ' -f4 | sed 's/[\[\/]/ /g' | sed 's/:/ /' |
55 | 55 | ||
56 } | 56 } | ||
Line 65: | Line 65: | ||
62 # Findes logfilen så kører vi | 62 # Findes logfilen så kører vi | ||
63 if ! [ -e $LOGFIL ] ; then | 63 if ! [ -e $LOGFIL ] ; then | ||
− | 64 exit 255 | + | 64 echo "$LOGIL kunne ikke findes." ; exit 255 |
65 fi | 65 fi | ||
66 | 66 | ||
Line 85: | Line 85: | ||
82 done | 82 done | ||
</source> | </source> | ||
+ | |||
+ | === Output fra scriptet === | ||
+ | <source lang=cli> | ||
+ | [tcj@mars ~/bin]$ HttpReport | ||
+ | HTTP Access rapport fra mars.tekkom.dk | ||
+ | ====================================== | ||
+ | |||
+ | Rapporten genereret: Fri Aug 28 23:55:13 CEST 2009 | ||
+ | |||
+ | ------------------------------------------------------------------------------------ | ||
+ | Data opsamlet er fra perioden den 26 Aug 2009 22:21:13 til den 28 Aug 2009 06:40:07 | ||
+ | ------------------------------------------------------------------------------------ | ||
+ | 806 192.168.146.155 () | ||
+ | 508 87.56.15.130 (0x57380f82.vgnqu2.dynamic.dsl.tele.dk.) | ||
+ | 306 77.212.13.52 (0x4dd40d34.adsl.cybercity.dk.) | ||
+ | 301 195.181.54.128 (pixuv.eucmidt.dk.) | ||
+ | 294 89.249.4.2 () | ||
+ | 283 192.168.146.156 () | ||
+ | . | ||
+ | . | ||
+ | . | ||
+ | </source> | ||
+ | |||
--[[User:Tcj|tcj]] 00:04, 29 August 2009 (CEST) | --[[User:Tcj|tcj]] 00:04, 29 August 2009 (CEST) | ||
+ | ::Hej Tomas. Rigtig flot og god løsning. :-) [[User:Heth|Henrik Thomsen]] 09:07, 30 August 2009 (CEST) |
Latest revision as of 07:47, 1 September 2009
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 $LOGFIL | 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 $LOGFIL | 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 echo "$LOGIL kunne ikke findes." ; 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
Output fra scriptet
[tcj@mars ~/bin]$ HttpReport
HTTP Access rapport fra mars.tekkom.dk
======================================
Rapporten genereret: Fri Aug 28 23:55:13 CEST 2009
------------------------------------------------------------------------------------
Data opsamlet er fra perioden den 26 Aug 2009 22:21:13 til den 28 Aug 2009 06:40:07
------------------------------------------------------------------------------------
806 192.168.146.155 ()
508 87.56.15.130 (0x57380f82.vgnqu2.dynamic.dsl.tele.dk.)
306 77.212.13.52 (0x4dd40d34.adsl.cybercity.dk.)
301 195.181.54.128 (pixuv.eucmidt.dk.)
294 89.249.4.2 ()
283 192.168.146.156 ()
.
.
.
--tcj 00:04, 29 August 2009 (CEST)
- Hej Tomas. Rigtig flot og god løsning. :-) Henrik Thomsen 09:07, 30 August 2009 (CEST)