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å!