12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- #!/bin/sh
- # Bzgrep wrapped for bzip2,
- # adapted from zgrep by Philippe Troin <phil@fifi.org> for Debian GNU/Linux.
- ## zgrep notice:
- ## zgrep -- a wrapper around a grep program that decompresses files as needed
- ## Adapted from a version sent by Charles Levert <charles@comm.polymtl.ca>
- PATH="/usr/bin:$PATH"; export PATH
- prog=`echo $0 | sed 's|.*/||'`
- case "$prog" in
- *egrep) grep=${EGREP-egrep} ;;
- *fgrep) grep=${FGREP-fgrep} ;;
- *) grep=${GREP-grep} ;;
- esac
- pat=""
- while test $# -ne 0; do
- case "$1" in
- -e | -f) opt="$opt $1"; shift; pat="$1"
- if test "$grep" = grep; then # grep is buggy with -e on SVR4
- grep=egrep
- fi;;
- -A | -B) opt="$opt $1 $2"; shift;;
- -*) opt="$opt $1";;
- *) if test -z "$pat"; then
- pat="$1"
- else
- break;
- fi;;
- esac
- shift
- done
- if test -z "$pat"; then
- echo "grep through bzip2 files"
- echo "usage: $prog [grep_options] pattern [files]"
- exit 1
- fi
- list=0
- silent=0
- op=`echo "$opt" | sed -e 's/ //g' -e 's/-//g'`
- case "$op" in
- *l*) list=1
- esac
- case "$op" in
- *h*) silent=1
- esac
- if test $# -eq 0; then
- bzip2 -cdfq | $grep $opt "$pat"
- exit $?
- fi
- res=0
- for i do
- if test -f "$i"; then :; else if test -f "$i.bz2"; then i="$i.bz2"; fi; fi
- if test $list -eq 1; then
- bzip2 -cdfq "$i" | $grep $opt "$pat" 2>&1 > /dev/null && echo $i
- r=$?
- elif test $# -eq 1 -o $silent -eq 1; then
- bzip2 -cdfq "$i" | $grep $opt "$pat"
- r=$?
- else
- j=$(echo "$i" | sed 's/\\/&&/g;s/|/\\&/g;s/&/\\&/g')
- j=`printf "%s" "$j" | tr '\n' ' '`
- # A trick adapted from
- # https://groups.google.com/forum/#!original/comp.unix.shell/x1345iu10eg/Nn1n-1r1uU0J
- # that has the same effect as the following bash code:
- # bzip2 -cdfq "$i" | $grep $opt "$pat" | sed "s|^|${j}:|"
- # r=${PIPESTATUS[1]}
- exec 3>&1
- eval `
- exec 4>&1 >&3 3>&-
- {
- bzip2 -cdfq "$i" 4>&-
- } | {
- $grep $opt "$pat" 4>&-; echo "r=$?;" >&4
- } | sed "s|^|${j}:|"
- `
- fi
- test "$r" -ne 0 && res="$r"
- done
- exit $res
|