xref: /freebsd/usr.bin/grep/zgrep.sh (revision 1070477cc8b7a88b1fd2b1ba810a1fff761799a1)
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