I början av Januari 2014 låstes Whoa och du kan alltså ej logga in eller skriva något nytt i forumen. Innehåll i forum osv kommer finnas tillgängligt. Läs Mer »

Shell/bash-programering expert sökes.

Hobby & Fritid - Datorer & Teknik

   

2008-10-28 14:28

Shell/bash-programering expert sökes.

TjaLOL!

Det är så att jag sitter och filar på ett lite script här som vars uppgift är att söka igenom lite loggfiler. Just nu använder jag mig av en while-loop och låter scriptet kolla varje rad efter intresse och om intresset finns vill jag ha ut hela sektionen av loggfilen där söksträngen fanns med. Här är ett exempel på hur min logfil kan se ut


----------------------------------
10:31:34.e04
Kalle loggad in på ip-nr. 192.168.13.37
----------------------------------
10:32:01.e33
Kalle köpte glass på www.glass.se
----------------------------------



Nu hade det ju varit guld om jag kunde på något sätt söka igenom dom här sektionerna med hjälp av grep istället efteresom det skulle minska resultattiden med ca 2 minuter på en logfil på ~200 000 rader.
Jag vet att grep är ett krafigt verktyg och att någon säkert sitter på en finurlig lösning. Det behöver självklart inte vara grep som gör jobbet, men om man kan få en markant skillnad och slippa parsa 2000 rader / sec så skulle det vara guld.


Är tacksam för all hjälp!


/B

Niceness!

2008-10-28 22:34
grep -A 1 -B 2 Kalle

-A för antal rader After raden med Kalle
-B för antal rader Before raden med Kalle
borde funka om jag fattat problemet rätt

(FreeBSD man pages är guld!!!)
Jag skaffade mig ett liv men nu har jag lagt det nånstans och kan inte hitta det. Fan också!

2008-10-30 14:32
flu P46

fast grejen är den att radantalet över och under det man greppar kan vvariera så jag kan inte ha fasta tal på hur mycket över och hur mkt under den ska ta. har redan kollat man för grep 20 gånger =/
Niceness!

2008-11-04 15:24
Du skulle behöva använda en regular expression för att få ut det du vill. Tyvärr suger jag på regex så jag kan inte ge dig några exempel..
There are no stupid questions, just stupid people - Mr. Garrison

2008-11-05 17:28
isf med sed eller awk antar jag ? för med egrep verkar det inte fungera . :( jag har ingen aning om hur eller om man kan greppa sektioner, det hade iaf vart fett .


ingen som har något tips ännu?
Niceness!

2008-11-07 09:57
Nej det ska räcka med grep, och även med de andra verktygen kommer du inte ifrån regex.

http://unix.se/Grep_och_regular_expressions
There are no stupid questions, just stupid people - Mr. Garrison

2008-11-07 10:29
Vet en lirare som skulle kunna ta fram en script, men måste få ändan ur och skriva ett mejl till honom för jag kommer definitivt inte orka hänga på telefonen och få det förklarat för mig. har skrivit dock liknande script i Fedora 8 eller 9 för 1-2-3 år sedan, ska se om jag har kvar kodsnutten.

2008-11-08 00:50
Eftersom du har ett variabelt antal rader före och efter sökbegreppet så räcker nog inte grep. Med awk kan man som vanligt göra allt man vill...

Här är ett script, filen logsearch.awk
BEGIN { hittat = 0; }
{ if( index( $0, "--------" ) )
{
i = 1;
delimiter = $0;
}
if( i > 0 )
{
if( index( $0, searchkey ) > 0)
{
for( j = 1; j < i; j += 1 ) print str_LEFTBRACK_ j _RIGHTBRACK_;
i = 0;
hittat = 1;
print;
}
else
{
str_LEFTBRACK_ i _RIGHTBRACK_ = $0;
i += 1;
}
}
else print;
}
END { if( hittat > 0 ) print delimiter; }
Nu är det slut på filen logsearch.awk

För att filen ska funka måste du byta _LEFTBRACK_ mot vänster hakparentes (ASCII 91) och _RIGHTBRACK_ mot höger hakparentes (ASCII 93), de tecknen går inte att posta på whoa.

Med denna fil kan man söka efter Kalle i loggfilen loggfil.txt med kommandot
awk -f logsearch.awk -v searchkey=Kalle loggfil.txt

Försök till förklaring.
Variabeln i dubbelarbetar som flagga och radräknare. Varje gång scriptet ser en rad med ------ så börjar det spara rader i vektorn str, med index i som räknas upp varje rad. Om scriptet sen hittar searchkey (typ Kalle) på en rad så kräks det upp alla sparade rader (for-loopen) och sen sätter det i = 0. Så länge i är noll så kopierar scriptet alla rader rakt av (raden else print;) så att du får ut raderna efter Kalle också. När scriptet hittar en ny rad med ------ så börjar det spara rader igen.
Om Kalle kan finnas på samma rad som ------- så kanske det inte funkar, det har jag inte testat.
BEGIN, END, och variablerna hittat och delimiter är ett lite kläggigt hack för att du ska få ut exakt en rad med ------ i början och i slutet och mellan varje träff på Kalle.
Jag skaffade mig ett liv men nu har jag lagt det nånstans och kan inte hitta det. Fan också!