1######################################################################## 2# # 3# This software is part of the ast package # 4# Copyright (c) 1982-2010 AT&T Intellectual Property # 5# and is licensed under the # 6# Common Public License, Version 1.0 # 7# by AT&T Intellectual Property # 8# # 9# A copy of the License is available at # 10# http://www.opensource.org/licenses/cpl1.0.txt # 11# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) # 12# # 13# Information and Software Systems Research # 14# AT&T Research # 15# Florham Park NJ # 16# # 17# David Korn <dgk@research.att.com> # 18# # 19######################################################################## 20function err_exit 21{ 22 print -u2 -n "\t" 23 print -u2 -r ${Command}[$1]: "${@:2}" 24 let Errors+=1 25} 26alias err_exit='err_exit $LINENO' 27 28Command=${0##*/} 29integer Errors=0 30 31tmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; } 32trap "cd /; rm -rf $tmp" EXIT 33 34function grep 35{ 36 # 37 # SHELL VERSION OF GREP 38 # 39 vflag= xflag= cflag= lflag= nflag= 40 set -f 41 while ((1)) # look for grep options 42 do case "$1" in 43 -v*) vflag=1;; 44 -x*) xflag=1;; 45 -c*) cflag=1;; 46 -l*) lflag=1;; 47 -n*) nflag=1;; 48 -b*) print 'b option not supported';; 49 -e*) shift;expr="$1";; 50 -f*) shift;expr=$(< $1);; 51 -*) print $0: 'unknown flag';return 2;; 52 *) 53 if test "$expr" = '' 54 then expr="$1";shift 55 fi 56 test "$xflag" || expr="*${expr}*" 57 break;; 58 esac 59 shift # next argument 60 done 61 noprint=$vflag$cflag$lflag # don't print if these flags are set 62 integer n=0 c=0 tc=0 nargs=$# # initialize counters 63 for i in "$@" # go thru the files 64 do if ((nargs<=1)) 65 then fname='' 66 else fname="$i": 67 fi 68 test "$i" && exec 0< $i # open file if necessary 69 while read -r line # read in a line 70 do let n=n+1 71 case "$line" in 72 $expr) # line matches pattern 73 test "$noprint" || print -r -- "$fname${nflag:+$n:}$line" 74 let c=c+1 ;; 75 *) # not a match 76 if test "$vflag" 77 then print -r -- "$fname${nflag:+$n:}$line" 78 fi;; 79 esac 80 done 81 if test "$lflag" && ((c)) 82 then print -r -- "$i" 83 fi 84 let tc=tc+c n=0 c=0 85 done 86 test "$cflag" && print $tc # print count if cflag is set 87 let tc # set the return value 88} 89 90cat > $tmp/grep <<\! 91this is a food bar test 92to see how many lines find both foo and bar. 93Some line contain foo only, 94and some lines contain bar only. 95However, many lines contain both foo and also bar. 96A line containing foobar should also be counted. 97There should be six lines with foo and bar. 98There are only two line with out foo but with bar. 99! 100 101if (( $(grep -c 'foo*bar' $tmp/grep ) != 6)) 102then err_exit 103fi 104exit $((Errors)) 105