Next Previous Contents

## 8. Using bzip2 with grep

The following utility, which I call bgrep, is a slight modification of the zgrep which comes with Linux. You can use it to grep through files without bunzip2'ing them first.

    #!/bin/sh

    # bgrep -- a wrapper around a grep program that decompresses files as needed
    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;;
      -*)      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 -cd | $grep $opt "$pat"
      exit $?
    fi

    res=0
    for i do
      if test $list -eq 1; then
        bzip2 -cdfq "$i" | $grep $opt "$pat" > /dev/null && echo $i
        r=$?
      elif test $# -eq 1 -o $silent -eq 1; then
        bzip2 -cd "$i" | $grep $opt "$pat"
        r=$?
      else
        bzip2 -cd "$i" | $grep $opt "$pat" | sed "s|^|${i}:|"
        r=$?
      fi
      test "$r" -ne 0 && res="$r"
    done
    exit $res

Next Previous Contents