grep log files in a date range for a string

I want to create a shell script that will have 4 variables passed in   one is a dir and the other is a time less 1 , 2 hours a string to search for and either print to the screen or write to a file.

For example

Script name  :check_log_files.ksh    
Var1 directory:  suppliers  
Var2 time - 1: -1    -2 -10    etc
Var3 grep: ORA-
Var4 write or print:    print

./check_log_files.ksh   suppliers -2   ORA- print

This would check the log files in /code/conversion/$1/log    for the word ORA- that were generated in the last two hours and print the file name and line with ORA- in it.    

./check_log_files.ksh   suppliers -2   ORA- write
This would do the same as above except write the output to a file. The file name would be

Only file of type .log and .lst are checked.

Thanks in advance.
Who is Participating?
So you don't want to see the ORA- messages created in the last n hours, but all ORA- messages in files having been updated n or less hours ago?

[[ $OP = "print" ]] && OP=""
[[ $OP = "write" ]] && OP=">${1}_$(date +%Y%m%d%H%M%S).txt"

find $DIR -type f -name "*.log" -o -name "*.lst" -mmin -$AGE | eval xargs grep $3 $OP


There is no checking for correct input parameters.
Adding such checks could be a nice task for you to learn a bit of scripting!


Pleas post examples of the .log and .lst entries. Obviously we need to know the format and location of the timestamp.

dplinnaneAuthor Commented:
-rw-r--r-- 1 jsmith consult   2305 2011-05-03 15:12 STO_no_chunk.skuo.20110503150236.log
-rw-r--r-- 1 jsmith consult   1354 2011-05-03 15:13 WH.skuy.20110503150001.log
-rw-r--r-- 1 jsmith consult   1356 2011-05-03 15:25 WH.skum.20110503150000.log
-rw-r--r-- 1 jsmith consult   2309 2011-05-03 16:37 STO_no_chunk.skuc.20110503150236.log
-rw-r--r-- 1 jsmith consult   1355 2011-05-03 18:00 WH.skus.20110503150000.log
-rw-r--r-- 1 jsmith consult   1354 2011-05-03 18:06 WH.skua.20110503150000.log
-rw-r--r-- 1 jsmith consult   2314 2011-05-03 19:19 STO_no_chunk.skul.20110503150236.log
-rw-r--r-- 1 jsmith consult   2318 2011-05-04 01:35 STO_no_chunk.skuy.20110503150236.log
-rw-r--r-- 1 jsmith consult   2317 2011-05-04 03:20 STO_no_chunk.skuk.20110503150236.log

I am just looking for ORA- errors mainly
here is an example
create.label_seq.sql.20110426184317.log:ORA-00955: name is already used by an existing object
Cloud Class® Course: CompTIA Cloud+

The CompTIA Cloud+ Basic training course will teach you about cloud concepts and models, data storage, networking, and network infrastructure.

Where is the timestamp? One line above? Please post more lines!

You might understand that we cannot know how old an entry is if there is not a timestamp somewhere.
dplinnaneAuthor Commented:
5th column is date  2011-05-03
6th column is time   15:12  
dplinnaneAuthor Commented:
Almost perfect.
It seems that the -mmin is not working properly. It give me all the files in the directory regardless of time stamp.

When I try find *.log -type f -mmin -60
This works fine I get the expected results.
I modified GE=$((${2#-}*60))
to GE=$((${2#-}*1))
so that I am searching for files in minutes and not hours.

What does the -o mean in
og" -o -name "*.lst"

"-o" means OR.

We search for files ending in .lst OR ending in .log, as you requested:
"Only file of type .log and .lst are checked."


dplinnaneAuthor Commented:
Thanks I though thats what it was but it seems to return all files in the directory like the -mmin -1 or -300 has no effect.
It will work for the way it is it just means a few hundred rows returned instead of 10 or 20
What is your OS?

"-o" and "-mmin" are pretty standard in almost any find implementations I'm aware of.

Maybe your find requires grouping (although that's implied with "-o)?

find $DIR  \( -name "*.log" -o -name "*.lst" \) -type f -mmin -$AGE | eval xargs grep $3 $OP

Please note that I put "-type f" behind the -name restrictions, to make it really textbook.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.