135 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
#!/bin/sh
 | 
						|
#
 | 
						|
# Copyright (c) 2003 Thomas Klausner.
 | 
						|
#
 | 
						|
# Redistribution and use in source and binary forms, with or without
 | 
						|
# modification, are permitted provided that the following conditions
 | 
						|
# are met:
 | 
						|
# 1. Redistributions of source code must retain the above copyright
 | 
						|
#    notice, this list of conditions and the following disclaimer.
 | 
						|
# 2. Redistributions in binary form must reproduce the above copyright
 | 
						|
#    notice, this list of conditions and the following disclaimer in the
 | 
						|
#    documentation and/or other materials provided with the distribution.
 | 
						|
#
 | 
						|
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 | 
						|
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
						|
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 | 
						|
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 | 
						|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 | 
						|
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
						|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
						|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
						|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 | 
						|
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
						|
 | 
						|
grep=${GREP:-grep}
 | 
						|
zcat=${ZCAT:-zstdcat}
 | 
						|
 | 
						|
endofopts=0
 | 
						|
pattern_found=0
 | 
						|
grep_args=""
 | 
						|
hyphen=0
 | 
						|
silent=0
 | 
						|
 | 
						|
prog=${0##*/}
 | 
						|
 | 
						|
# handle being called 'zegrep' or 'zfgrep'
 | 
						|
case $prog in
 | 
						|
    *egrep*) prog=zegrep; grep_args='-E';;
 | 
						|
    *fgrep*) prog=zfgrep; grep_args='-F';;
 | 
						|
    *)       prog=zstdgrep;;
 | 
						|
esac
 | 
						|
 | 
						|
# skip all options and pass them on to grep taking care of options
 | 
						|
# with arguments, and if -e was supplied
 | 
						|
 | 
						|
while [ "$#" -gt 0 ] && [ "${endofopts}" -eq 0 ]; do
 | 
						|
    case "$1" in
 | 
						|
    # from GNU grep-2.5.1 -- keep in sync!
 | 
						|
        -[ABCDXdefm])
 | 
						|
            if [ "$#" -lt 2 ]; then
 | 
						|
                printf '%s: missing argument for %s flag\n' "${prog}" "$1" >&2
 | 
						|
                exit 1
 | 
						|
            fi
 | 
						|
            case "$1" in
 | 
						|
                -e)
 | 
						|
                    pattern="$2"
 | 
						|
                    pattern_found=1
 | 
						|
                    shift 2
 | 
						|
                    break
 | 
						|
                    ;;
 | 
						|
                -f)
 | 
						|
                    pattern_found=2
 | 
						|
                    ;;
 | 
						|
                *)
 | 
						|
                    ;;
 | 
						|
            esac
 | 
						|
            grep_args="${grep_args} $1 $2"
 | 
						|
            shift 2
 | 
						|
            ;;
 | 
						|
        --)
 | 
						|
            shift
 | 
						|
            endofopts=1
 | 
						|
            ;;
 | 
						|
        -)
 | 
						|
            hyphen=1
 | 
						|
            shift
 | 
						|
            ;;
 | 
						|
        -h)
 | 
						|
            silent=1
 | 
						|
            shift
 | 
						|
            ;;
 | 
						|
        -*)
 | 
						|
            grep_args="${grep_args} $1"
 | 
						|
            shift
 | 
						|
            ;;
 | 
						|
        *)
 | 
						|
            # pattern to grep for
 | 
						|
            endofopts=1
 | 
						|
            ;;
 | 
						|
    esac
 | 
						|
done
 | 
						|
 | 
						|
# if no -e option was found, take next argument as grep-pattern
 | 
						|
if [ "${pattern_found}" -lt 1 ]; then
 | 
						|
    if [ "$#" -ge 1 ]; then
 | 
						|
        pattern="$1"
 | 
						|
        shift
 | 
						|
    elif [ "${hyphen}" -gt 0 ]; then
 | 
						|
        pattern="-"
 | 
						|
    else
 | 
						|
        printf '%s: missing pattern\n' "${prog}" >&2
 | 
						|
        exit 1
 | 
						|
    fi
 | 
						|
fi
 | 
						|
 | 
						|
EXIT_CODE=0
 | 
						|
# call grep ...
 | 
						|
if [ "$#" -lt 1 ]; then
 | 
						|
    # ... on stdin
 | 
						|
    set -f # Disable file name generation (globbing).
 | 
						|
    # shellcheck disable=SC2086
 | 
						|
    "${zcat}" - | "${grep}" ${grep_args} -- "${pattern}" -
 | 
						|
    EXIT_CODE=$?
 | 
						|
    set +f
 | 
						|
else
 | 
						|
    # ... on all files given on the command line
 | 
						|
    if [ "${silent}" -lt 1 ] && [ "$#" -gt 1 ]; then
 | 
						|
        grep_args="-H ${grep_args}"
 | 
						|
    fi
 | 
						|
    set -f
 | 
						|
    while [ "$#" -gt 0 ]; do
 | 
						|
        # shellcheck disable=SC2086
 | 
						|
        if [ $pattern_found -eq 2 ]; then
 | 
						|
            "${zcat}" -- "$1" | "${grep}" --label="${1}" ${grep_args} -- -
 | 
						|
        else
 | 
						|
            "${zcat}" -- "$1" | "${grep}" --label="${1}" ${grep_args} -- "${pattern}" -
 | 
						|
        fi
 | 
						|
        [ "$?" -ne 0 ] && EXIT_CODE=1
 | 
						|
        shift
 | 
						|
    done
 | 
						|
    set +f
 | 
						|
fi
 | 
						|
 | 
						|
exit "${EXIT_CODE}"
 |