Working with compressed files

From LPTMS Wiki
Revision as of 16:08, 11 December 2011 by Roux (talk | contribs)

Jump to: navigation, search

Linux usually provides a couple of command piping gzip

zgrep, zcat, zdiff, zless, zmore, zegrep,...

Here is a simple extension of tail and head for zipped files, that you can call ztail and zhead (example is for tail, replace "tail" with "head" everywhere to get zhead) and add to your own /bin directory:

Caution:

very basic version, works when the options starts with '-' so it works with '-n10' but fails with '-n 10'. Should be easily improved...

#!/bin/bash                                                                                                                                                  

# based on zless                                                                                                                                             

PATH=${GZIP_BINDIR-'/bin'}:$PATH

version="ztail 0.1"

usage="Usage: $0 [OPTIONS]... [FILES]...                                                                                                                     
                                                                                                                                                             
Same as the 'tail' command, but operate on the uncompressed contents of any compressed FILEs.                                                                
Options are the same as for 'tail'."

case $1 in
--help)    exec echo "$usage";;
-h)        exec echo "$usage";;
--version) exec echo "$version";;
esac

options=""
count=0
for i in $@; do
str="$i"
if test -f $i && [ ${str:(-3)} = ".gz" ]; then
    files[++count]=$str
else
    if [ ${str:0:1} = "-" ] && [ $str != "-v" ] && [ $str != "--verbose" ]; then
	options=$options"$i "
    elif [ $str != "-v" ] && [ $str != "--verbose" ]; then
        echo -ne "***Warning: $i is neither a regular zip file or a regular option***\n\n"
    fi
fi
done

if [ $count -gt 0 ]; then
    if [ $count -eq 1 ]; then
        exec gzip -cd ${files[1]} | tail $options
    else
        for j in `seq 1 $count`; do
            echo "==>"${files[j]}"<=="
            exec gzip -cd ${files[j]} | tail $options
        done
    fi
else
    echo -ne "***Warning: no regular zip files given***\n\n"
    exec echo "$usage"
fi