Denne postingen handler om noen litt nerdete verktøy. Som er veldig nyttige. Som jeg bare har hørt om før, men nå endelig har tatt i bruk. Disse verktøyene får Windows til å henge enda lengre bak unix-systemer. Jeg har litt følelsen av at jeg om noen måneder kommer til å lure på hvordan jeg klarte meg uten, akkurat som det sies at det er med strøm på hytta.
Så en liten innføring i grep, sed, sort, uniq, | og >.
Se for deg at du har en fil som ser slik ut:
213.236.225.194 - - [10/Jun/2004:14:49:25 +0200] "GET /__data/site/design/1/images/pixel.gif HTTP/1.1" 200 49 "http://www.mar-eco.no/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
213.236.225.194 - - [10/Jun/2004:14:49:39 +0200] "GET /contact HTTP/1.1" 200 20292 "http://www.mar-eco.no/learning-zone/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)"
213.236.225.194 - - [10/Jun/2004:14:49:40 +0200] "GET /about/management HTTP/1.1" 200 33250 "http://www.mar-eco.no/contact" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)"
213.236.225.194 - - [10/Jun/2004:14:49:48 +0200] "GET /__data/site/design/3/images/learning_button_u.jpg HTTP/1.1" 200 2655 "http://www.mar-eco.no/Shiptoshore/g._o._sars?MySourceSession=021420da4f6c8a72b87dc493590b82c2" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
Denne fila er på hundre tusen linjer eller så. Hver linje tilsvarer et treff på en hjemmeside, webserveren logger dette til en fil slik at du kan analysere det etterpå - både for å finne ut hvilke sider som er mest besøkt, hvilke nettlesere som brukes og andre ting. De første tallene er ip-adressen til besøkende, så kommer datoen for når besøket var, hvilken HTTP-kommando de sendte (altså hvilken side de var på), hva webserveren svarte, hvor mye data webserveren sendte, og hvilken gjesten bruker. Bare Microsoft Internet Explorer i dette utdraget (stakkars).
Hva hvis jeg vil finne ut av hva folk som besøker nettstedet vårt søker etter? Da må jeg søke igjennom disse tusenvis av linjene på jakt etter linjer som ser slik ut:
193.214.57.46 - - [10/Jun/2004:12:52:48 +0200] "GET /__lib/images/file_types/pdf.gif HTTP/1.1" 200 332 "http://mareco.imr.no/search?search_mode=simple&action=Sea
rch&sort_mode=total_score&at_least_one_query=search&submit.x=7&submit.y=8" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 4.0) Opera 7.23 [nb]"
193.214.57.46 - - [10/Jun/2004:12:52:58 +0200] "GET /search?search_mode=simple&action=Search&at_least_one_query=photos¤t_page= HTTP/1.1" 200 24995 "http://
mareco.imr.no/search?search_mode=simple&action=Search&sort_mode=total_score&at_least_one_query=search&submit.x=7&submit.y=8" "Mozilla/4.0 (compatible; MSIE 6.0;
Windows NT 4.0) Opera 7.23 [nb]"
Nøkkelen er å finne teksten "GET /search?search_mode=simple&action=Search&at_least_one_query=photos¤t_page= ", der det gjesten har søkt på, er ordet som kommer bak at_least_one_query=. Photos i dette tilfellet, altså. Her kommer grep til nytte, kommandoen "grep at_least_one_query access_log" vil søke igjennom filen access_log, og bare ta med linjene som nettopp inneholder søkeord.
Da sitter jeg igjen med bare noen hundre linjer. Som ser omtrent slik ut:
193.214.57.46 - - [10/Jun/2004:12:52:48 +0200] "GET /__lib/images/file_types/pdf.gif HTTP/1.1" 200 332 "http://mareco.imr.no/search?search_mode=simple&action=Sea
rch&sort_mode=total_score&at_least_one_query=search&submit.x=7&submit.y=8" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 4.0) Opera 7.23 [nb]"
193.214.57.46 - - [10/Jun/2004:12:52:58 +0200] "GET /search?search_mode=simple&action=Search&at_least_one_query=photos¤t_page= HTTP/1.1" 200 24995 "http://
mareco.imr.no/search?search_mode=simple&action=Search&sort_mode=total_score&at_least_one_query=search&submit.x=7&submit.y=8" "Mozilla/4.0 (compatible; MSIE 6.0;
Windows NT 4.0) Opera 7.23 [nb]"
Hva nå? Jeg vil jo bare vite hvilke søkeord som er brukt, og kanskje - hvis det ikke er for stress - hvor mange ganger hvert ord er brukt. Jeg kunne kanskje klippet og limt hvert ord for hånd, og puttet i et regneark, men det er jo kjedelig. Jeg må finne en måte å hviske ut det som ikke er søkeord - og det er her sed kommer til nytte.
sed "s/.*query=//" vil ta bort alt som er før "query=" på enhver linje. Da er jeg ca halvveis! sed -e "s/[&\" ].*//" tar bort alt som kommer bak søkeordet. -e "s/+/ /" er den siste tingen jeg ber sed om å gjøre, for i access_log-en blir alle mellomrom erstattet med +. For at resultatet skal bli pent skifter jeg det tilbake igjen.
Nå har jeg fremdeles like mange linjer igjen - men her begynner det å ligne på noe i alle fall:
fish
fish
bilder
heino
Problemet nå er jo at noen søkeord listes ut flere ganger, og jeg kan ikke med letthet finne ut hvor mye hvert ord er brukt. Til dette bruker jeg sort og uniq. Hvis du sender tusen linjer igjennom uniq, så vil den ta bort de som kommer to ganger etter hverandre. Derfor sorterer jeg først listen over søkeord alfabetisk med sort -b -f:
bilder
fish
fish
heino
Så gir jeg resultatet til uniq -c - som først tar bort duplikatene og så legger på hvor mange ganger en linje ble gjentatt:
9 rov
7 scanmar
203 search
1 torkelsen
Dette begynner jo å ligne på noe! Jeg kunne godt stoppet her, men nå er jeg varm i trøya og vil ha et perfekt resultat. Det innebærer at søkene er rangert med de mest brukte på toppen. Da må vi ha hjelp av sort igjen!
sort -n -r blir kommandoen. -r sier at den skal skrive resultatet i revers, altså med det største tallet først. Og da får vi resultatet:
203 search
40 opdahl
32 molv%E6r
32 flyer
12 azores
9 rov
Skal si folk er interessert i å søke på search? Det er nesten litt merkelig. Heldigvis finnes det en god forklaring. access_log-en er hentet fra
Mar-Eco-prosjektet sine hjemmesider, og hvis du ser i søkefeltet i menyen øverst står det 'search' i søkeboksen, og så er det en knapp ved siden av som viser søkeresultatene. Mange av brukerne våre klikker direkte på søkeboksen, uten å skrive noe i søkefeltet først, og vips søker de på 'search'. Forvirrende? Ja, antakeligvis. Derfor bør vi gjøre noe med dette. Men dette med web-brukervennlighet er en annen historie.
Konklusjon på hele denne lange historen her:
Windows mangler noen fantastisk nyttige verktøy som er så enkle at det er rart man ikke finner det der. Et system som koster hundrvis av kroner i innkjøp ligger altså etter systemer du kan laste ned gratis fra nettet. Merk deg at all denne søkingen og erstattingen og tellingen ble gjort i en eneste kommando:
grep at_least_one_query access_log | sed -e "s/.*query=//" -e "s/[&\" ].*//" -e "s/+/ /" | sort -b -f | uniq -c | sort -n -r > search_mareco_no.txt
Litt mer effektivt enn hva jeg måtte gjort i Windows. Jeg er ikke sikker på hvordan jeg kunne fått dette til på Windows, da, men jeg er i alle fall glad for at jeg slipper.
Takk for meg.