#! /bin/sh # Zgrep - Grep wrapper for compressed files. # Copyright (C) 2008, 2009 Antonio Diaz Diaz. # # This script is free software: you have unlimited permission # to copy, distribute and modify it. LC_ALL=C export LC_ALL args= have_pat=0 list=0 no_name=0 two_hyphens=0 # Loop over args until pattern is found while [ x"$1" != x ] ; do case "$1" in --help | --he* | -h) echo "Zgrep - Grep wrapper for compressed files." echo echo "Zgrep is a wrapper script around the grep command that allows" echo "transparent search on any combination of compressed and non-compressed" echo "files. If any given file is compressed, its uncompressed content is" echo "used. If a given file does not exist, zgrep tries the compressed file" echo "names corresponding to the supported compressors." echo "The supported compressors are gzip, bzip2, lzip and xz." echo echo "Usage: $0 [OPTIONS] [GREP_OPTIONS] PATTERN [FILES]" echo echo "GREP_OPTIONS are passed directly to grep." echo "The exit status from grep is preserved." echo echo "Options:" echo " -h, --help display this help and exit" echo " -V, --version output version information and exit" echo echo "Report bugs to zutils-bug@nongnu.org" echo "Zutils home page: http://www.nongnu.org/zutils/zutils.html" exit 0 ;; --version | --ve* | -V) echo "Zgrep VERSION" echo "Copyright (C) 2009 Antonio Diaz Diaz." echo "This script is free software: you have unlimited permission" echo "to copy, distribute and modify it." exit 0 ;; -[drRzZ] | --di* | --exc* | --inc* | --nu* | --rec*) echo "$0: option $1 not supported" exit 1 ;; -e?* | -f?* | --file=* | --reg*=*) args="${args} $1"; have_pat=1 ;; -e | -f | --file | --reg*) args="${args} $1 $2"; shift; have_pat=1 ;; --*=*) args="${args} $1" ;; -[ABCDm] | --af* | --be* | --binary-* | --con* | --de* | --[lm]a*) args="${args} $1 $2"; shift ;; -l | --files-with-*) args="${args} $1"; list=1 ;; -h | --no-f*) args="${args} $1"; no_name=1 ;; --) shift ; two_hyphens=1 ; break ;; -?*) args="${args} $1" ;; *) if [ ${have_pat} = 0 ]; then args="${args} $1"; have_pat=1 else break fi ;; esac shift done if [ ${have_pat} = 0 ]; then echo "$0: Pattern not found; use --help for usage." 1>&2 exit 1 fi retval=0 for i in "$@" ; do if [ "$i" = "--" ] && [ ${two_hyphens} = 0 ] ; then two_hyphens=1 else if [ -f "$i" ]; then case "$i" in *.gz | *.tgz) prog="gzip -cdfq" ;; *.bz2 | *.tbz | *.tbz2) prog="bzip2 -cdfq" ;; *.lz | *.tlz) prog="lzip -cdfq" ;; *.xz | *.txz) prog="xz -cdfq" ;; *) prog=cat ;; esac elif [ -f "$i.gz" ]; then i="$i.gz" ; prog="gzip -cdfq" elif [ -f "$i.bz2" ]; then i="$i.bz2" ; prog="bzip2 -cdfq" elif [ -f "$i.lz" ]; then i="$i.lz" ; prog="lzip -cdfq" elif [ -f "$i.xz" ]; then i="$i.xz" ; prog="xz -cdfq" else echo "$0: File \"$i\" not found or not a regular file" 1>&2 if [ ${retval} = 0 ]; then retval=1 ; fi continue fi if [ ${list} = 1 ]; then ${prog} -- "$i" | grep ${args} 2>&1 > /dev/null && echo "$i" r=$? elif [ $# = 1 ] || [ ${no_name} = 1 ]; then ${prog} -- "$i" | grep ${args} r=$? else j=`printf "%s" "$i" | sed 's/\\\\/\\\\\\\\/g'` j=`printf "%s" "$j" | sed 's/|/\\\\|/g'` j=`printf "%s" "$j" | sed 's/&/\\\\&/g'` j=`printf "%s" "$j" | tr '\n' ' '` ${prog} -- "$i" | grep ${args} | sed "s|^|${j}:|" r=$? fi [ $r != 0 ] && retval="$r" fi done exit ${retval}