1*0ac9a9daSXin Li#!/bin/sh 2*0ac9a9daSXin Li 3*0ac9a9daSXin Li# Bzgrep wrapped for bzip2, 4*0ac9a9daSXin Li# adapted from zgrep by Philippe Troin <[email protected]> for Debian GNU/Linux. 5*0ac9a9daSXin Li## zgrep notice: 6*0ac9a9daSXin Li## zgrep -- a wrapper around a grep program that decompresses files as needed 7*0ac9a9daSXin Li## Adapted from a version sent by Charles Levert <[email protected]> 8*0ac9a9daSXin Li 9*0ac9a9daSXin LiPATH="/usr/bin:$PATH"; export PATH 10*0ac9a9daSXin Li 11*0ac9a9daSXin Liprog=`echo $0 | sed 's|.*/||'` 12*0ac9a9daSXin Licase "$prog" in 13*0ac9a9daSXin Li *egrep) grep=${EGREP-egrep} ;; 14*0ac9a9daSXin Li *fgrep) grep=${FGREP-fgrep} ;; 15*0ac9a9daSXin Li *) grep=${GREP-grep} ;; 16*0ac9a9daSXin Liesac 17*0ac9a9daSXin Lipat="" 18*0ac9a9daSXin Liwhile test $# -ne 0; do 19*0ac9a9daSXin Li case "$1" in 20*0ac9a9daSXin Li -e | -f) opt="$opt $1"; shift; pat="$1" 21*0ac9a9daSXin Li if test "$grep" = grep; then # grep is buggy with -e on SVR4 22*0ac9a9daSXin Li grep=egrep 23*0ac9a9daSXin Li fi;; 24*0ac9a9daSXin Li -A | -B) opt="$opt $1 $2"; shift;; 25*0ac9a9daSXin Li -*) opt="$opt $1";; 26*0ac9a9daSXin Li *) if test -z "$pat"; then 27*0ac9a9daSXin Li pat="$1" 28*0ac9a9daSXin Li else 29*0ac9a9daSXin Li break; 30*0ac9a9daSXin Li fi;; 31*0ac9a9daSXin Li esac 32*0ac9a9daSXin Li shift 33*0ac9a9daSXin Lidone 34*0ac9a9daSXin Li 35*0ac9a9daSXin Liif test -z "$pat"; then 36*0ac9a9daSXin Li echo "grep through bzip2 files" 37*0ac9a9daSXin Li echo "usage: $prog [grep_options] pattern [files]" 38*0ac9a9daSXin Li exit 1 39*0ac9a9daSXin Lifi 40*0ac9a9daSXin Li 41*0ac9a9daSXin Lilist=0 42*0ac9a9daSXin Lisilent=0 43*0ac9a9daSXin Liop=`echo "$opt" | sed -e 's/ //g' -e 's/-//g'` 44*0ac9a9daSXin Licase "$op" in 45*0ac9a9daSXin Li *l*) list=1 46*0ac9a9daSXin Liesac 47*0ac9a9daSXin Licase "$op" in 48*0ac9a9daSXin Li *h*) silent=1 49*0ac9a9daSXin Liesac 50*0ac9a9daSXin Li 51*0ac9a9daSXin Liif test $# -eq 0; then 52*0ac9a9daSXin Li bzip2 -cdfq | $grep $opt "$pat" 53*0ac9a9daSXin Li exit $? 54*0ac9a9daSXin Lifi 55*0ac9a9daSXin Li 56*0ac9a9daSXin Lires=0 57*0ac9a9daSXin Lifor i do 58*0ac9a9daSXin Li if test -f "$i"; then :; else if test -f "$i.bz2"; then i="$i.bz2"; fi; fi 59*0ac9a9daSXin Li if test $list -eq 1; then 60*0ac9a9daSXin Li bzip2 -cdfq "$i" | $grep $opt "$pat" 2>&1 > /dev/null && echo $i 61*0ac9a9daSXin Li r=$? 62*0ac9a9daSXin Li elif test $# -eq 1 -o $silent -eq 1; then 63*0ac9a9daSXin Li bzip2 -cdfq "$i" | $grep $opt "$pat" 64*0ac9a9daSXin Li r=$? 65*0ac9a9daSXin Li else 66*0ac9a9daSXin Li j=$(echo "$i" | sed 's/\\/&&/g;s/|/\\&/g;s/&/\\&/g') 67*0ac9a9daSXin Li j=`printf "%s" "$j" | tr '\n' ' '` 68*0ac9a9daSXin Li # A trick adapted from 69*0ac9a9daSXin Li # https://groups.google.com/forum/#!original/comp.unix.shell/x1345iu10eg/Nn1n-1r1uU0J 70*0ac9a9daSXin Li # that has the same effect as the following bash code: 71*0ac9a9daSXin Li # bzip2 -cdfq "$i" | $grep $opt "$pat" | sed "s|^|${j}:|" 72*0ac9a9daSXin Li # r=${PIPESTATUS[1]} 73*0ac9a9daSXin Li exec 3>&1 74*0ac9a9daSXin Li eval ` 75*0ac9a9daSXin Li exec 4>&1 >&3 3>&- 76*0ac9a9daSXin Li { 77*0ac9a9daSXin Li bzip2 -cdfq "$i" 4>&- 78*0ac9a9daSXin Li } | { 79*0ac9a9daSXin Li $grep $opt "$pat" 4>&-; echo "r=$?;" >&4 80*0ac9a9daSXin Li } | sed "s|^|${j}:|" 81*0ac9a9daSXin Li ` 82*0ac9a9daSXin Li fi 83*0ac9a9daSXin Li test "$r" -ne 0 && res="$r" 84*0ac9a9daSXin Lidone 85*0ac9a9daSXin Liexit $res 86