#!/bin/sh -
PATH=/bin:/usr/bin; export PATH

dflthosts=$HOME/etc/hosts

# hosts - list hosts with given keys
# Steve Kinzler, steve@kinzler.com, Sep 93/Jan 02
# https://kinzler.com/me/home.html#homedir

HOSTS=${HOSTS-$dflthosts}
l=1
v=; bad=

while :
do
	case $# in
	0)	break;;
	*)	case "$1" in
		-)	HOSTS=;;
		-l)	l=0;;
		-v)	v=$1;;

		--)	shift; break;;
		-h)	bad=t; break;;
		-*)	bad=t; echo "$0: unknown option ($1)" 1>&2;;
		*)	break;;
		esac
		shift;;
	esac
done

case "$bad" in
?*)	cat << EOF 1>&2
usage: $0 [ - ] [ -l ] [ -v ] [ 0-9... | NF | key ... ]
	-	read hosts file on stdin
	-l	list all columns for matched hosts
	-v	invert matching criteria
The hosts file is taken as \$HOSTS else $dflthosts.
A column number indicates matching on first unique values for that column,
with NF indicating the last column.
EOF
	exit 1;;
esac

cat $HOSTS |
sed -e :a -e '/\\$/N; s/.\n//; ta' |
sed '	s/#.*//
	s/[ 	][ 	]*/	/g
	/^	*$/d
	s/^	//; s/	$//' |

case "$#,`echo "$1" | grep -E '^[0-9][0-9]*$|^NF$'`" in
1,?*)
	case "$v" in
	?*)	v=!;;
	*)	v==;;
	esac

	awk '{ if (seen[$'$1'] '$v'= "") print $'$l'
	       seen[$'$1']++ }';;

*)
	patt=`echo $* | sed 's/^/@/; s/ /@|@/g; s/$/@/'`
	case "$patt" in
	''|@@)	patt=\^;;
	esac

	sed 's/^/@/; s/	/@@/g; s/$/@/' |
	grep -E $v "$patt" |

	case "$l" in
	0)	sed 's/^@//; s/@@/	/g; s/@$//';;
	*)	sed 's/^@//; s/@.*//';;
	esac;;
esac
