GREP

Community Forums/Showcase/GREP

NewtSoup(Posted 2003) [#1]
I got bored, I am a MUD programmer in my spare time and part of the job includes checking logs. These logs are usually very very long text files so I wrote a little app to do the job for me. Yes you can use find to do almost the same job and yes UNIX grep too but mine has 1 neat feature that the others don't have, whilst it does not support regular expressions what you can do is search for a pattern in a file with an optional exclusion pattern so you can do:
grep /f c:\documents and settings\logfile.txt /p Luke /e logout

which will fetch all lines containing the pattern "Luke" which do not contain the pattern "logout"

here's the (ropey) code:

;grep /f c:\path\to\file /p pattern [/e exclude]
Type result
	Field info$
End Type


Graphics 640,480,16,2
a$=CommandLine()
If a$= ""  Then
	quit_program("Usage grep /f filename /p pattern [/e exclude_pattern]")
End If

                 
Global pattern$
Global exclude$
Global file$
parseline(a$)

infile=ReadFile (file)
If Not infile Then quit_program("File: "+file+" not found")
counter=0
Global count=0
srtbusy$=""

SetBuffer BackBuffer()
While Not Eof(infile)
	Cls
	Text 15,15, "Searching "+file
	Text 15,35, "For lines containing :"+pattern+":"
	If exlcude<>"" Then	Text 15,55, "Excluding lines containing "+exclude
	counter=counter+1
	l$=ReadLine(infile)
	If counter Mod(5)=0 strbusy$=strbusy+"."
	
	If Instr(l,pattern)
		If  exclude="" Then
			add_result(l)
		Else If Not Instr(l,exclude) Then
			add_result(l)	
		End If
	End If
	
	Text 15,75,""+counter+" lines processed."
	Text 15,95,""+count+" occurences found."
	Text 15,115,strbusy
	If strbusy="...................." strbusy=""
	If KeyHit(1) Then quit_program("User Aborted!")
	Flip(1)
Wend

If count Then 
	outfile =WriteFile ("grep_resutlts.txt")
	For n.result=Each result
	WriteLine (outfile, n\info)
	Next
	Text 15,135,"Done"

	Text 15,155,"Results written to: "+CurrentDir()+"grep_results.txt"
	Text 15,175,"Press any key to continue."
Else
	Text 15,135,"No Matches Found"
	Text 15,155,"Press any key to continue."
End If 
Flip(1)
WaitKey
End 


Function parseline(the_line$)
	idxf= Instr(the_line,"/f")
	If Left(the_line,2)<>"/f" quit_program("Usage grep /f filename /p pattern [/e exclude_pattern]")	
	If Not idxf Then quit_program("Usage grep /f filename /p pattern [/e exclude_pattern]")
	idxp=Instr(the_line,"/p")
	If Not idxp Then quit_program("Usage grep /f filename /p pattern [/e exclude_pattern]")
	
	idxe=Instr(the_line,"/e")
	If (idxf>idxp) Then quit_program("Usage grep /f filename /p pattern [/e exclude_pattern]")
	If (idxe>0) And (idxe<idxp) Then quit_program("Usage grep /f filename /p pattern [/e exclude_pattern]")		
	
	file=Mid(the_line,idxf+3,idxp-5)
	If idxe Then
		pattern=Mid(the_line,idxp+3,idxe-idxp-4)
		exclude=Right(the_line,Len(the_line)-idxe-2)
	Else
		pattern=Right(the_line,Len(the_line)-idxp-2)
	End If

End Function
Function add_result(l$)
	count=count+1
	r.result=New result
	r\info=l
End Function


Function quit_program(message$)
	Print message
	Print "Press any key."
	WaitKey
	End
End Function


EULA
Take it, use it modify it, give it away, but if you make it use reg-exp's then I want a copy. Theres nothing in it a newbie can't cope with so if you must claim it as your own then do so with my pity ;)

- Luke


myspys(Posted 2003) [#2]
uhm. grep does that

cat FILE | grep Luke | grep -v Logout


don't underestimate the power of the command line


Warren(Posted 2003) [#3]
Yes but since Windows machines don't have a grep command, this code might be useful to some people.


NewtSoup(Posted 2003) [#4]
Heh ok, but that's quite an obscure command line, the functionality is not quite there in one command. I will however note it for future use, I hadnt thought of using it like that ;)

I suspect linux users while more common here than in the general internet community will still be somewhat of a minority. Now if we could have a Blitz Compiler for linux... you listening Mark? :)

I havent used linux since I fumbled the configuration on my last kernel tweak. But thats another story and one for the Gentoo db's

Have a look at my Challenge post if you fancy something with a bit more of a challenge to it.

regards

- Luke


myspys(Posted 2003) [#5]
noo, having grep for windows is very good

i just wanted to set the record straight when it came to grep on linux

all the gnu textutils are meant to be used like that, chain commands together. that's what makes them so powerful, piping text from one util into another.

:)