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