1612c330dSBaptiste Daroussin#!/bin/sh 2612c330dSBaptiste Daroussin# 3612c330dSBaptiste Daroussin# Copyright (c) 2003 Thomas Klausner. 4612c330dSBaptiste Daroussin# 5612c330dSBaptiste Daroussin# Redistribution and use in source and binary forms, with or without 6612c330dSBaptiste Daroussin# modification, are permitted provided that the following conditions 7612c330dSBaptiste Daroussin# are met: 8612c330dSBaptiste Daroussin# 1. Redistributions of source code must retain the above copyright 9612c330dSBaptiste Daroussin# notice, this list of conditions and the following disclaimer. 10612c330dSBaptiste Daroussin# 2. Redistributions in binary form must reproduce the above copyright 11612c330dSBaptiste Daroussin# notice, this list of conditions and the following disclaimer in the 12612c330dSBaptiste Daroussin# documentation and/or other materials provided with the distribution. 13612c330dSBaptiste Daroussin# 14612c330dSBaptiste Daroussin# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15612c330dSBaptiste Daroussin# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16612c330dSBaptiste Daroussin# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17612c330dSBaptiste Daroussin# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18612c330dSBaptiste Daroussin# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19612c330dSBaptiste Daroussin# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20612c330dSBaptiste Daroussin# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21612c330dSBaptiste Daroussin# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22612c330dSBaptiste Daroussin# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23612c330dSBaptiste Daroussin# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24612c330dSBaptiste Daroussin# 25612c330dSBaptiste Daroussin 266a88262dSBaptiste Daroussinset -u 27612c330dSBaptiste Daroussingrep=grep 28612c330dSBaptiste Daroussinzcat=zstdcat 29612c330dSBaptiste Daroussin 30612c330dSBaptiste Daroussinendofopts=0 31c4cbf1fbSCraig Lerespattern_file=0 32612c330dSBaptiste Daroussinpattern_found=0 33612c330dSBaptiste Daroussingrep_args="" 34612c330dSBaptiste Daroussinhyphen=0 35612c330dSBaptiste Daroussinsilent=0 36612c330dSBaptiste Daroussin 379fdb4cfaSBaptiste Daroussinprg=${0##*/} 38612c330dSBaptiste Daroussin 39612c330dSBaptiste Daroussin# handle being called 'zegrep' or 'zfgrep' 40612c330dSBaptiste Daroussincase ${prg} in 41612c330dSBaptiste Daroussin*egrep) 42612c330dSBaptiste Daroussin grep_args="-E";; 43612c330dSBaptiste Daroussin*fgrep) 44612c330dSBaptiste Daroussin grep_args="-F";; 45612c330dSBaptiste Daroussinesac 46612c330dSBaptiste Daroussin 47612c330dSBaptiste Daroussincatargs="-f" 48612c330dSBaptiste Daroussincase ${prg} in 49612c330dSBaptiste Daroussinzstd*) 50612c330dSBaptiste Daroussin cattool="/usr/bin/zstdcat" 51612c330dSBaptiste Daroussin catargs="-fq" 52612c330dSBaptiste Daroussin ;; 53612c330dSBaptiste Daroussinbz*) 54612c330dSBaptiste Daroussin cattool="/usr/bin/bzcat" 55612c330dSBaptiste Daroussin ;; 56612c330dSBaptiste Daroussinz*) 57612c330dSBaptiste Daroussin cattool="/usr/bin/zcat" 58612c330dSBaptiste Daroussin ;; 59612c330dSBaptiste Daroussinxz*) 60612c330dSBaptiste Daroussin cattool="/usr/bin/xzcat" 61612c330dSBaptiste Daroussin ;; 62612c330dSBaptiste Daroussinlz*) 63612c330dSBaptiste Daroussin cattool="/usr/bin/lzcat" 64612c330dSBaptiste Daroussin ;; 65612c330dSBaptiste Daroussin*) 66612c330dSBaptiste Daroussin echo "Invalid command: ${prg}" >&2 67612c330dSBaptiste Daroussin exit 1 68612c330dSBaptiste Daroussin ;; 69612c330dSBaptiste Daroussinesac 70612c330dSBaptiste Daroussin 71612c330dSBaptiste Daroussin# skip all options and pass them on to grep taking care of options 72612c330dSBaptiste Daroussin# with arguments, and if -e was supplied 73612c330dSBaptiste Daroussin 74612c330dSBaptiste Daroussinwhile [ $# -gt 0 -a ${endofopts} -eq 0 ] 75612c330dSBaptiste Daroussindo 76612c330dSBaptiste Daroussin case $1 in 77*1070477cSCraig Leres # from GNU grep-2.6.0 -- keep in sync! 78c4cbf1fbSCraig Leres --) 79c4cbf1fbSCraig Leres shift 80c4cbf1fbSCraig Leres endofopts=1 81c4cbf1fbSCraig Leres ;; 82c4cbf1fbSCraig Leres --file=*) 83c4cbf1fbSCraig Leres pattern_file=1 84c4cbf1fbSCraig Leres grep_args="${grep_args} ${1}" 85c4cbf1fbSCraig Leres shift 86c4cbf1fbSCraig Leres ;; 87c4cbf1fbSCraig Leres --regexp=*) 88*1070477cSCraig Leres if [ ${pattern_found} -ne 0 ]; then 89*1070477cSCraig Leres grep_args="${grep_args} -e ${pattern}" 90*1070477cSCraig Leres fi 91c4cbf1fbSCraig Leres pattern="${1#--regexp=}" 92c4cbf1fbSCraig Leres pattern_found=1 93c4cbf1fbSCraig Leres shift 94c4cbf1fbSCraig Leres ;; 951032f7b8SEugene Grosbein -h|--no-filename) 961032f7b8SEugene Grosbein silent=1 971032f7b8SEugene Grosbein shift 981032f7b8SEugene Grosbein ;; 9916e0391fSMateusz Piotrowski -V|--version) 10016e0391fSMateusz Piotrowski exec ${grep} -V 10116e0391fSMateusz Piotrowski ;; 102c4cbf1fbSCraig Leres --*) 103c4cbf1fbSCraig Leres grep_args="${grep_args} $1" 104c4cbf1fbSCraig Leres shift 105c4cbf1fbSCraig Leres ;; 106*1070477cSCraig Leres -[EFGHILOSUVabchilnopqsuvwxyz]*) 107*1070477cSCraig Leres post="${1#-?}" 108*1070477cSCraig Leres pre=${1%${post}} 109*1070477cSCraig Leres grep_args="${grep_args} ${pre}" 110*1070477cSCraig Leres shift 111*1070477cSCraig Leres # Put back partial arg 112*1070477cSCraig Leres set -- "-${post}" $* 113*1070477cSCraig Leres ;; 114*1070477cSCraig Leres -[ABCDdefm]) 115612c330dSBaptiste Daroussin if [ $# -lt 2 ] 116612c330dSBaptiste Daroussin then 117612c330dSBaptiste Daroussin echo "${prg}: missing argument for $1 flag" >&2 118612c330dSBaptiste Daroussin exit 1 119612c330dSBaptiste Daroussin fi 120612c330dSBaptiste Daroussin case $1 in 121*1070477cSCraig Leres -e) 122*1070477cSCraig Leres if [ ${pattern_found} -ne 0 ]; then 123*1070477cSCraig Leres grep_args="${grep_args} -e ${pattern}" 124*1070477cSCraig Leres fi 125612c330dSBaptiste Daroussin pattern="$2" 126612c330dSBaptiste Daroussin pattern_found=1 127612c330dSBaptiste Daroussin shift 2 128c4cbf1fbSCraig Leres continue 129c4cbf1fbSCraig Leres ;; 130*1070477cSCraig Leres -f) 131c4cbf1fbSCraig Leres pattern_file=1 132612c330dSBaptiste Daroussin ;; 133612c330dSBaptiste Daroussin *) 134612c330dSBaptiste Daroussin ;; 135612c330dSBaptiste Daroussin esac 136612c330dSBaptiste Daroussin grep_args="${grep_args} $1 $2" 137612c330dSBaptiste Daroussin shift 2 138612c330dSBaptiste Daroussin ;; 139*1070477cSCraig Leres -[ABCDdefm]*) 140*1070477cSCraig Leres post="${1#-e}" 141*1070477cSCraig Leres case ${1} in 142*1070477cSCraig Leres -e*) 143*1070477cSCraig Leres if [ ${pattern_found} -ne 0 ]; then 144*1070477cSCraig Leres grep_args="${grep_args} -e ${pattern}" 145*1070477cSCraig Leres fi 146*1070477cSCraig Leres pattern="${post}" 147*1070477cSCraig Leres pattern_found=1 148*1070477cSCraig Leres shift 149*1070477cSCraig Leres continue 150*1070477cSCraig Leres ;; 151*1070477cSCraig Leres -f*) 152*1070477cSCraig Leres pattern_file=1 153*1070477cSCraig Leres ;; 154*1070477cSCraig Leres *) 155*1070477cSCraig Leres ;; 156*1070477cSCraig Leres esac 157*1070477cSCraig Leres grep_args="${grep_args} ${post}" 158*1070477cSCraig Leres shift 159*1070477cSCraig Leres ;; 160612c330dSBaptiste Daroussin -) 161612c330dSBaptiste Daroussin hyphen=1 162612c330dSBaptiste Daroussin shift 163612c330dSBaptiste Daroussin ;; 16442fd147fSKyle Evans -r|-R) 16542fd147fSKyle Evans echo "${prg}: the ${1} flag is not currently supported" >&2 16642fd147fSKyle Evans exit 1 16742fd147fSKyle Evans ;; 168*1070477cSCraig Leres -?) 169612c330dSBaptiste Daroussin grep_args="${grep_args} $1" 170612c330dSBaptiste Daroussin shift 171612c330dSBaptiste Daroussin ;; 172612c330dSBaptiste Daroussin *) 173612c330dSBaptiste Daroussin # pattern to grep for 174612c330dSBaptiste Daroussin endofopts=1 175612c330dSBaptiste Daroussin ;; 176612c330dSBaptiste Daroussin esac 177612c330dSBaptiste Daroussindone 178612c330dSBaptiste Daroussin 179612c330dSBaptiste Daroussin# if no -e option was found, take next argument as grep-pattern 180c4cbf1fbSCraig Leresif [ ${pattern_file} -eq 0 -a ${pattern_found} -eq 0 ] 181612c330dSBaptiste Daroussinthen 182612c330dSBaptiste Daroussin if [ $# -ge 1 ]; then 183612c330dSBaptiste Daroussin pattern="$1" 184612c330dSBaptiste Daroussin shift 185612c330dSBaptiste Daroussin elif [ ${hyphen} -gt 0 ]; then 186612c330dSBaptiste Daroussin pattern="-" 187612c330dSBaptiste Daroussin else 188612c330dSBaptiste Daroussin echo "${prg}: missing pattern" >&2 189612c330dSBaptiste Daroussin exit 1 190612c330dSBaptiste Daroussin fi 191c4cbf1fbSCraig Leres pattern_found=1 192612c330dSBaptiste Daroussinfi 193612c330dSBaptiste Daroussin 194*1070477cSCraig Leres# Clean up possible leading blank 195*1070477cSCraig Leresgrep_args="${grep_args# }" 196*1070477cSCraig Leres 197612c330dSBaptiste Daroussin# call grep ... 198612c330dSBaptiste Daroussinif [ $# -lt 1 ] 199612c330dSBaptiste Daroussinthen 200612c330dSBaptiste Daroussin # ... on stdin 201c4cbf1fbSCraig Leres if [ ${pattern_file} -eq 0 ]; then 202*1070477cSCraig Leres ${cattool} ${catargs} - | ${grep} ${grep_args} -e "${pattern}" -- - 203612c330dSBaptiste Daroussin else 20463c8336dSEric van Gyzen ${cattool} ${catargs} - | ${grep} ${grep_args} -- - 205c4cbf1fbSCraig Leres fi 20663c8336dSEric van Gyzen ret=$? 207c4cbf1fbSCraig Lereselse 208612c330dSBaptiste Daroussin # ... on all files given on the command line 209612c330dSBaptiste Daroussin if [ ${silent} -lt 1 -a $# -gt 1 ]; then 210612c330dSBaptiste Daroussin grep_args="-H ${grep_args}" 211612c330dSBaptiste Daroussin fi 21263c8336dSEric van Gyzen # Succeed if any file matches. First assume no match. 21363c8336dSEric van Gyzen ret=1 2146a88262dSBaptiste Daroussin for file; do 215c4cbf1fbSCraig Leres if [ ${pattern_file} -eq 0 ]; then 216920a817cSBryan Drewery ${cattool} ${catargs} -- "${file}" | 217*1070477cSCraig Leres ${grep} --label="${file}" ${grep_args} -e "${pattern}" -- - 218c4cbf1fbSCraig Leres else 219c4cbf1fbSCraig Leres ${cattool} ${catargs} -- "${file}" | 22063c8336dSEric van Gyzen ${grep} --label="${file}" ${grep_args} -- - 22163c8336dSEric van Gyzen fi 22263c8336dSEric van Gyzen this_ret=$? 22363c8336dSEric van Gyzen # A match (0) overrides a no-match (1). An error (>=2) overrides all. 22463c8336dSEric van Gyzen if [ ${this_ret} -eq 0 -a ${ret} -eq 1 ] || [ ${this_ret} -ge 2 ]; then 22563c8336dSEric van Gyzen ret=${this_ret} 226c4cbf1fbSCraig Leres fi 227612c330dSBaptiste Daroussin done 228612c330dSBaptiste Daroussinfi 229612c330dSBaptiste Daroussin 230920a817cSBryan Dreweryexit ${ret} 231