bash - Use Awk and Grep to find lines between two time in a log file -


i'm searching log file see if contains string between 2 different time. i.e. if foo exists between lines starts timestamp of 2016-11-10 06:45:00 , 2016-11-10 10:45:00 threshold variable sets time between, example 240 4 hours.

current="$(date "+%y-%m-%d %h:%m:%s")" threshold=240 dt_format="+%y-%m-%d %h:%m:%s" from="$(date -d "$threshold minutes ago" "$dt_format")"  if awk '$0 >= "$from" && $0 <= "$current"' /path/file.log | grep "foo"    exit 0 else    exit 1 fi 

however i'm not sure why when pass $from , $current in command line in if statement, it's not reading it. it's if i'm passing in garbage it's not comparing dates right , return lines , exit 0.

but if manually put in dates in if statement, i.e. 2016-11-10 06:45:00 from , 2016-11-10 10:45:00 current returns correct lines in between 2 dates , can use grep check whether lines contain foo.

i don't understand why code isn't working, , can't manually put in dates need able check between 2 different time based on needs changing threshold variable.

2016-11-10 06:45:00 how timestamp formatted in log, starting in beginning of each lines.

thanks.

you attempting have bash expand variables single quotes... run s="string"; echo '$s' , you'll see mean.

so '$0 >= "$from" && $0 <= "$current"' literally means exact characters. not wanted.

"but that's argument awk"... right awk knows how handle $0 , $1, awk expanding those. expecting awk '$0 >= "some_time" && $0 <= "some_other_time"' didn't!

so, way pass variables awk doing some_variable="world"; awk -v my_variable=$some_variable 'begin{print "hello", my_variable}'

so should have if awk -v f="$from" -v c="$current" '$0 >= f && $0 <= c' /path/file.log | grep "foo"

check out http://www.catonmat.net/blog/ten-awk-tips-tricks-and-pitfalls/ article has insight neat things can awk. might able use "split file on patterns" here reduce amount of commands use either way you'll learn awk.


Comments