1a19eddc3SBaptiste Daroussin#!/bin/sh 2a19eddc3SBaptiste Daroussin# 3a19eddc3SBaptiste Daroussin# Copyright (c) 2003 Thomas Klausner. 4a19eddc3SBaptiste Daroussin# 5a19eddc3SBaptiste Daroussin# Redistribution and use in source and binary forms, with or without 6a19eddc3SBaptiste Daroussin# modification, are permitted provided that the following conditions 7a19eddc3SBaptiste Daroussin# are met: 8a19eddc3SBaptiste Daroussin# 1. Redistributions of source code must retain the above copyright 9a19eddc3SBaptiste Daroussin# notice, this list of conditions and the following disclaimer. 10a19eddc3SBaptiste Daroussin# 2. Redistributions in binary form must reproduce the above copyright 11a19eddc3SBaptiste Daroussin# notice, this list of conditions and the following disclaimer in the 12a19eddc3SBaptiste Daroussin# documentation and/or other materials provided with the distribution. 13a19eddc3SBaptiste Daroussin# 14a19eddc3SBaptiste Daroussin# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15a19eddc3SBaptiste Daroussin# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16a19eddc3SBaptiste Daroussin# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17a19eddc3SBaptiste Daroussin# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18a19eddc3SBaptiste Daroussin# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19a19eddc3SBaptiste Daroussin# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20a19eddc3SBaptiste Daroussin# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21a19eddc3SBaptiste Daroussin# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22a19eddc3SBaptiste Daroussin# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23a19eddc3SBaptiste Daroussin# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24a19eddc3SBaptiste Daroussin 253f774a5eSConrad Meyergrep=${GREP:-grep} 263f774a5eSConrad Meyerzcat=${ZCAT:-zstdcat} 27a19eddc3SBaptiste Daroussin 28a19eddc3SBaptiste Daroussinendofopts=0 29a19eddc3SBaptiste Daroussinpattern_found=0 30a19eddc3SBaptiste Daroussingrep_args="" 31a19eddc3SBaptiste Daroussinhyphen=0 32a19eddc3SBaptiste Daroussinsilent=0 33a19eddc3SBaptiste Daroussin 343f774a5eSConrad Meyerprog=${0##*/} 35a19eddc3SBaptiste Daroussin 36a19eddc3SBaptiste Daroussin# handle being called 'zegrep' or 'zfgrep' 373f774a5eSConrad Meyercase $prog in 383f774a5eSConrad Meyer *egrep*) prog=zegrep; grep_args='-E';; 393f774a5eSConrad Meyer *fgrep*) prog=zfgrep; grep_args='-F';; 403f774a5eSConrad Meyer *) prog=zstdgrep;; 41a19eddc3SBaptiste Daroussinesac 42a19eddc3SBaptiste Daroussin 43a19eddc3SBaptiste Daroussin# skip all options and pass them on to grep taking care of options 44a19eddc3SBaptiste Daroussin# with arguments, and if -e was supplied 45a19eddc3SBaptiste Daroussin 46af73257bSConrad Meyerwhile [ "$#" -gt 0 ] && [ "${endofopts}" -eq 0 ]; do 47af73257bSConrad Meyer case "$1" in 48a19eddc3SBaptiste Daroussin # from GNU grep-2.5.1 -- keep in sync! 49a19eddc3SBaptiste Daroussin -[ABCDXdefm]) 50af73257bSConrad Meyer if [ "$#" -lt 2 ]; then 513f774a5eSConrad Meyer printf '%s: missing argument for %s flag\n' "${prog}" "$1" >&2 52a19eddc3SBaptiste Daroussin exit 1 53a19eddc3SBaptiste Daroussin fi 54af73257bSConrad Meyer case "$1" in 55a19eddc3SBaptiste Daroussin -e) 56a19eddc3SBaptiste Daroussin pattern="$2" 57a19eddc3SBaptiste Daroussin pattern_found=1 58a19eddc3SBaptiste Daroussin shift 2 59a19eddc3SBaptiste Daroussin break 60a19eddc3SBaptiste Daroussin ;; 61fa94c738SConrad Meyer -f) 62fa94c738SConrad Meyer pattern_found=2 63fa94c738SConrad Meyer ;; 64a19eddc3SBaptiste Daroussin *) 65a19eddc3SBaptiste Daroussin ;; 66a19eddc3SBaptiste Daroussin esac 67a19eddc3SBaptiste Daroussin grep_args="${grep_args} $1 $2" 68a19eddc3SBaptiste Daroussin shift 2 69a19eddc3SBaptiste Daroussin ;; 70a19eddc3SBaptiste Daroussin --) 71a19eddc3SBaptiste Daroussin shift 72a19eddc3SBaptiste Daroussin endofopts=1 73a19eddc3SBaptiste Daroussin ;; 74a19eddc3SBaptiste Daroussin -) 75a19eddc3SBaptiste Daroussin hyphen=1 76a19eddc3SBaptiste Daroussin shift 77a19eddc3SBaptiste Daroussin ;; 78a19eddc3SBaptiste Daroussin -h) 79a19eddc3SBaptiste Daroussin silent=1 80a19eddc3SBaptiste Daroussin shift 81a19eddc3SBaptiste Daroussin ;; 82a19eddc3SBaptiste Daroussin -*) 83a19eddc3SBaptiste Daroussin grep_args="${grep_args} $1" 84a19eddc3SBaptiste Daroussin shift 85a19eddc3SBaptiste Daroussin ;; 86a19eddc3SBaptiste Daroussin *) 87a19eddc3SBaptiste Daroussin # pattern to grep for 88a19eddc3SBaptiste Daroussin endofopts=1 89a19eddc3SBaptiste Daroussin ;; 90a19eddc3SBaptiste Daroussin esac 91a19eddc3SBaptiste Daroussindone 92a19eddc3SBaptiste Daroussin 93a19eddc3SBaptiste Daroussin# if no -e option was found, take next argument as grep-pattern 94af73257bSConrad Meyerif [ "${pattern_found}" -lt 1 ]; then 95af73257bSConrad Meyer if [ "$#" -ge 1 ]; then 96a19eddc3SBaptiste Daroussin pattern="$1" 97a19eddc3SBaptiste Daroussin shift 98af73257bSConrad Meyer elif [ "${hyphen}" -gt 0 ]; then 99a19eddc3SBaptiste Daroussin pattern="-" 100a19eddc3SBaptiste Daroussin else 1013f774a5eSConrad Meyer printf '%s: missing pattern\n' "${prog}" >&2 102a19eddc3SBaptiste Daroussin exit 1 103a19eddc3SBaptiste Daroussin fi 104a19eddc3SBaptiste Daroussinfi 105a19eddc3SBaptiste Daroussin 106af73257bSConrad MeyerEXIT_CODE=0 107a19eddc3SBaptiste Daroussin# call grep ... 108af73257bSConrad Meyerif [ "$#" -lt 1 ]; then 109a19eddc3SBaptiste Daroussin # ... on stdin 110af73257bSConrad Meyer set -f # Disable file name generation (globbing). 111af73257bSConrad Meyer # shellcheck disable=SC2086 112bc64b5ceSConrad Meyer "${zcat}" - | "${grep}" ${grep_args} -- "${pattern}" - 113af73257bSConrad Meyer EXIT_CODE=$? 114af73257bSConrad Meyer set +f 115a19eddc3SBaptiste Daroussinelse 116a19eddc3SBaptiste Daroussin # ... on all files given on the command line 117af73257bSConrad Meyer if [ "${silent}" -lt 1 ] && [ "$#" -gt 1 ]; then 118a19eddc3SBaptiste Daroussin grep_args="-H ${grep_args}" 119a19eddc3SBaptiste Daroussin fi 120af73257bSConrad Meyer set -f 121af73257bSConrad Meyer while [ "$#" -gt 0 ]; do 122af73257bSConrad Meyer # shellcheck disable=SC2086 123fa94c738SConrad Meyer if [ $pattern_found -eq 2 ]; then 124bc64b5ceSConrad Meyer "${zcat}" -- "$1" | "${grep}" --label="${1}" ${grep_args} -- - 125fa94c738SConrad Meyer else 126bc64b5ceSConrad Meyer "${zcat}" -- "$1" | "${grep}" --label="${1}" ${grep_args} -- "${pattern}" - 127fa94c738SConrad Meyer fi 1283f774a5eSConrad Meyer [ "$?" -ne 0 ] && EXIT_CODE=1 129a19eddc3SBaptiste Daroussin shift 130a19eddc3SBaptiste Daroussin done 131af73257bSConrad Meyer set +f 132a19eddc3SBaptiste Daroussinfi 133a19eddc3SBaptiste Daroussin 134af73257bSConrad Meyerexit "${EXIT_CODE}" 135