grep is the name of a common utility on many Unix or unix like systems.
Folklore says that the name represents a command that developers in the old days used to issue within their editor or other similar program:
g/re/p
which was a global {regular expression} print command.
Grep reads through one or more input streams (stdin or files), searching for a string of text which represents some for of a regular expression, and, depending on options provided, may produce the matching lines of input.
RS wrote this tiny, and feature-poor, emulation for use on PocketPC (but it should run elsewhere too):
proc grep {re args} { set files [eval glob -types f $args] foreach file $files { set fp [open $file] while {[gets $fp line] >= 0} { if [regexp -- $re $line] { if {[llength $files] > 1} {puts -nonewline $file:} puts $line } } close $fp } }
# Test:
catch {console show} puts "Result:\n[grep "require" "*.tcl"]"
Here's another version - I wrote this out of desperation because the real grep -f ate up all my memory, and then busted, under Cygwin (remove the leading blank in the # line for an executable script):
#!/usr/bin/env tclsh proc main argv { set usage {usage: grep-f.tcl refile ?file...? > outdata} if {[llength $argv]<1} {puts $usage; exit} set fp [open [lindex $argv 0]] set REset [split [string trim [read $fp]] \n] close $fp if {[llength $argv] == 1} { grep-f $REset stdin } else { foreach file [lrange $argv 1 end] { set fp [open $file] grep-f $REset $fp close $fp } } } proc grep-f {REset fp} { while {[gets $fp line] >= 0} { foreach RE $REset { if {[regexp $RE $line]} { puts $line break } } } } main $argv
See also a grep-like utility - A little file searcher with GUI