Actual Tricks, shells, csh aliases and the like, 2 of 3

Nancy Blachman nancy at resonex.UUCP
Wed Oct 17 07:22:55 AEST 1984


> [Know anybody with a GREAT .login or .cshrc?]

> I'm interested in collecting the little tricks, shell scripts, awk
> hacks, csh aliases, and such that people have built to make their daily
> life a little easier or more automatic.  Being a fairly new system
> administrator I don't have the big toolbox that years of messing around
> will leave you with.  If you have any hacks you're proud of (or that
> you aren't proud of, but which work anyway), and you're willing to make
> them public, mail them to me.  I'll collect, collate, shuffle, sort,
> munge, judge, select and discard them and then "summarize to the net".

This article focuses shell scripts I received in response to my solicitation.  
The first article of this series concentrates on  aliases, and .cshrc and 
.login files. The third article centers on C programs and awk scripts.

/\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\/
> Nancy Blachman {allegra,hplabs,ihnp4,sun}!resonex!nancy  (408)720 8600 x37 <
/\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\/

::::::::::::::
shells/1
::::::::::::::
Return-Path: <allegra!vax135!cornell!tesla!mac>
Received: by resonex.UUCP (4.12/4.7)
	id AA16733; Thu, 13 Sep 84 20:46:23 pdt
Received: by CORNELL-GVAX.ARPA (4.30/4.30)
	id AA09277; Thu, 13 Sep 84 20:39:41 edt
Received: by tesla.UUCP (4.12/4.7)
	id AA23915; Thu, 13 Sep 84 12:49:57 edt
Date: Thu, 13 Sep 84 12:49:57 edt
From: allegra!vax135!cornell!tesla!mac (Michael Mc Namara)
Message-Id: <8409131649.AA23915 at tesla.UUCP>
To: cornell!vax135!houxm!mhuxl!ulysses!allegra!resonex!nancy
Subject: Cute cshell - sh scripts



    If your are like most UNIX systems, you have a plethora of different
terminals that  your system  is supposed to support.  Sure, with termcap
and terminfo, and programs written to use them, the interface gets easier.
If you only ever login to one particular terminal, you can 

set term = "vt131"

or 

TERM=vt131
export TERM

in your .login or .profile.

But what if you,  or some of your users,  drift  around using different
terminal types-- You have a terminal room with many different terminals.

Here is a set of shell scripts & C programs that use the "echo terminal
type" command that many terminals support, to do automatic terminal type
identification and setting:  (of course I've only made it work for  the 
terminals we have here at Cornell, and some day I should write more of it
in C...)

    This one is written for cshell:

##########################################
#    Identify and set terminal type (csh)#
##########################################
set noglob
echo Please wait...
stty cbreak -echo
# this sequence will cause all terminals we have to echo something
# except for adm's; those users are told to hit 'a' when they see
# please wait
echo ' CZ[c'
sleep 1      
# this calls a c program to grab the id string from the terminal 
# program is included later...
set type = `/usr/new/rin.login`
stty -cbreak echo new crt
#########################
# the or in the vt100 terminal type is because vt100's respond
# to both ^[Z and ^[[c, but DEC threatens to eliminate one of 
# the responces (I forget which).. The extra stty back you see
# with DG terminals (Data General) is because their backspace is
# ^Y instead of ^H ( Home on DG terminals) This involves a modification
# of stty, which you would care about only if you have them--Write to me.
##################
if ( $type == "[?1;0c" || $type == "[?1;0c[?1;0c" ) then
     set term = vt100
     echo "VT101"                            
else if ( $type == "[?1;2c" || $type == "[?1;2c[?1;2c" ) then
     set term = vt100
     echo "VT100"
else if ( $type == "[?1;11c[?1;11c") then
     set term = ct500
     echo "[7mCIT - 500[m"
else if ( $type == "[?12;5;0;102c" ) then
     set term = vt100
     echo "VT125"
else if ($type == "[?1;2c[?1;2c") then
     set term = vt100
     echo "VT100, with Selenar Graphics"
else if ( $type == "o#\!R" ) then
     set term = dg200
     stty stop undef start undef back  
     echo "DDG200E"
else if ( $type == "o#'C3" ) then
     set term = dg450
     stty back  
     echo "FS11BFS00 DATA GENERAL DASHER D450" 
else if ( $type == "o#'K3" ) then 
     set term = dg450
     stty back  
     echo "FS11BFS00 DATA GENERAL DASHER D450" 
else if ( $type == "/K" ) then
     set term = vt52
     echo "Visual 50"
else if ( $type =~ "\\4*" ) then
     set term = hp2621          
     echo HP2621
else if ( $type =~ "a" ) then
     set term = adm3a
     echo "adm3a"
else if ($type == "50" ) then
     set term = w50
     echo "WYSE50"
else
# Ask user for terminal type -- for some reason the above didn't work
set no_name_yet=1
set no_name_yet = 1;
while( $no_name_yet )
   echo -n "Please enter terminal type (hit return for menu) "
   set ttyname = ($< );
   switch( $ttyname )
   case d450:
   case dg450:
      set term=dg450;
      stty back 
      set no_name_yet = 0;
      breaksw;
   case vt100:
      set term=vt100;
      set no_name_yet = 0;
      breaksw;
   case v50:
   case vt52:
      set term=vt52;
      set no_name_yet = 0;
      breaksw;
   case hp2621:
   case hp:
      set term=hp2621;
      set no_name_yet = 0;
      breaksw;
   case wyse50:
      set term=w100;
      set no_name_yet = 0;
      breaksw;
   case adm5:
      set term=adm5;  
      set no_name_yet = 0;
      breaksw;
   case adm3+:                 
   case adm3:
   case adm3a:
      set term=adm3+;
      set no_name_yet = 0;
   case d200:
   case dg200:
      set term=dg200;
      stty stop undef start undef back ;
      set no_name_yet = 0;
      breaksw;
   case other:
      echo -n "Enter terminal name: "
      set term=($< );
      set no_name_yet = 0;
      breaksw;
   case '':
      echo Terminal abbreviations are:
      echo "Dasher 450 : dg450"
      echo "Dasher 200 : dg200"
      echo "Visual 50  : v50"
      echo "VT100      : vt100"
      echo "HP 2621    : hp2621"
      echo "ADM5       : adm5"
      echo "ADM3+      : adm3+"
      echo "Use 'other' to specify terminals not on this menu"
      breaksw;
   default:
      echo "I didn't understand that. Hit return for a menu."
   endsw
end
unset no_name_yet
unset ttyname
endif
stty -cbreak
stty echo
unset noglob

Ok, This one is used for Bourne shell lovers:  (I used /bin/test because
one user had an executable file called test somewhere in his path ahead
of where this program lived...That one took days to track down...)


echo "Please Wait..."
stty start  stop   crt new back  -echo cbreak
echo ' CZ[c'
sleep 1
TYPE=`/usr/new/rin.login`
stty echo -cbreak
if ( /bin/test \( $TYPE = "[?1;0c" \) -o \( $TYPE = "[?1;0c[?1;0c" \) ) then
     TERM=vt100
     echo "[7mVT101[m" 
elif ( /bin/test \( $TYPE = "[?1;2c" \) -o \( $TYPE = "[?1;2c[?1;2c" \)  ) then
     TERM=vt100
     echo "#3[7mVT100[m"
     echo "#4?[7mVT100[m"
elif ( /bin/test  $TYPE = "[?1;11c[?1;11c") then
     TERM=ct500
     echo "CT 500"
elif ( /bin/test  $TYPE = "o#!R" ) then
     TERM=dg200
     stty stop undef
     stty start undef
     stty crt
     stty back 
     echo "D DATA GENERAL DASHER D200E"
elif ( /bin/test $TYPE = "o#'C3" )  then
     TERM=dg450
     stty crt   
     stty back 
     echo "FS11BFS00 DATA GENERAL DASHER D450"
elif ( /bin/test $TYPE = "/K" ) then
     TERM=vt52
     echo "UVisual 50T"
elif ( /bin/test $TYPE = "50" ) then
     TERM=w50
     clear
     echo "WYSE 50"
elif ( /bin/test $TYPE = "\4088000" ) then
     TERM=hp2621
     echo HP2621
elif ( /bin/test $TYPE = "a" ) then
     TERM=adm3a
     echo ADM3a
else
     stty start 
     stty stop  
     stty new crt
     set no_name_yet=1
echo
while ($no_name_yet) do {
  echo
  echo Which terminal do you have?
  echo       Hit return for a menu.
  read INP
  case $INP
    in
100 | v | vt100) {
                  TERM=vt100
                  break
             } ;;
adm5)            {
                 TERM=adm5
                 break
             } ;;
adm3+)           {
                 TERM=adm3+
                 break
             } ;;
450 | dg450 | d450)  {
                  TERM=dg450
                  stty back 
                  break
             } ;;
200 | dg200 | d200)  {
                  TERM=dg200
                  stty stop undef
                  stty start undef
                  stty back 
                  break
             }  ;;
 50 | vt52 | v50)   { 
                  TERM=vt52
                  break
             } ;;
 2621 | hp2621 | hp) {
                  TERM=hp2621
                  break
             } ;;
      other) {
                  echo -n Enter terminal name:
                  read tname
                  TERM=$tname
                  break
             } ;;
 ''|?|help)  {    echo Terminal abbreviations are:
                  echo 
                  echo Dasher 450:  dg450
                  echo Dasher 200:  dg200
                  echo Visual  50:  vt52
                  echo VT100     :  vt100
                  echo HP 2621   :  hp2621
                  echo ADM3+     :  adm3+
                  echo ADM5      :  adm5
                  echo "Use 'other' to specify other terminals."
                  echo
             } ;;
        * )  {   echo "I did not understand that."
             } ;;
  esac
  }
done
fi
export TERM

*********
And here is the c program that read's in the terminal ID string:


/* rin -- read in a char string which may not be terminated */
char buf[256];
int n;
main ()
{
n = read(0,buf,256);
write(1,buf,n);
printf("\n");
}

***************


        Use them, abuse them.  Of course you have to paw through
your terminal manuanls to discover what (if any) string they respond to,
and test for the response accordingly...

                                        ---MAC



::::::::::::::
shells/2
::::::::::::::
Return-Path: <hplabs!tektronix!azure!billp>
Received: by resonex.UUCP (4.12/4.7)
	id AA17950; Fri, 14 Sep 84 03:44:50 pdt
Received: by HP-VENUS id AA07773; Fri, 14 Sep 84 03:10:28 pdt
Message-Id: <8409141010.AA07773 at HP-VENUS>
From: hplabs!azure!billp
To: tektronix!hplabs!resonex!nancy
Received: from azure.uucp by tektronix ; 13 Sep 84 09:35:27 PDT
Date: Thursday, 13 Sep 84 09:23:49 PDT
Subject: Re: Tricks, shell and awk scripts, csh aliases and the like

Here are some that I like and use a lot.  'del' and 'undelete' are just two
links to the same file.  This way if somebody copies one, they get the other too
-------------------------------------------------------------------------------
::::::::::::::
: mv
::::::::::::::
: 'prompts if the destination file already exists'
/bin/mv -i $*
-------------------------------------------------------------------------------
::::::::::::::
: cp
::::::::::::::
: 'prompts if the destination file already exists'
/bin/cp -i $*
-------------------------------------------------------------------------------
::::::::::::::
: del, undelete
::::::::::::::
: '"del" throws files into the waste basket'
: 'files preceded by "," are automagically removed after 7 days'
: '"undelete" pulls files out of the waste basket'
: 'if invoked without an argument, both commands list the contents of the'
: 'waste basket.'

case $0 in
*del)
    if test -z "$1"
    then
	ls -lus $HOME/.waste_basket
    else
	for i
	do
	    echo -n "deleting "
	    tmp=`basename $i`
	    /bin/mv -i $i $HOME/.waste_basket/,$tmp
	    echo $i
	done
    fi;;

*undelete)
    if test -z "$1"
    then
	ls -lus $HOME/.waste_basket
    else
	for i
	do
	    echo -n "recovering "
	    tmp=`basename $i`
	    /bin/mv -i $HOME/.waste_basket/,$tmp $i
	    echo $i
	done
    fi;;
esac
-------------------------------------------------------------------------------
::::::::::::::
: vi
::::::::::::::
: 'backs up file(s) before editing them'
: 'files preceded by "," are automagically removed after 7 days'
for i
do
    if test -f $i
    then
	echo -n "backing up "
	tmp=`basename $i`
	/bin/cp -i $i $HOME/.vi_backup/,$tmp
	echo $i
    fi
done
/usr/ucb/vi $*
-------------------------------------------------------------------------------

	Bill Pfeifer
{ucbvax,decvax,ihnp4,allegra,uw-beaver,hplabs} !tektronix!tekmdp!billp

::::::::::::::
shells/3
::::::::::::::
Return-Path: <turtlevax!ken>
Received: by resonex.UUCP (4.12/4.7)
	id AA15216; Thu, 13 Sep 84 15:21:15 pdt
Received: by turtlevax.UUCP (4.12/4.1)
	id AA10295; Thu, 13 Sep 84 13:58:09 pdt
Date: Thu, 13 Sep 84 13:58:09 pdt
From: turtlevax!ken (Ken Turkowski)
Message-Id: <8409132058.AA10295 at turtlevax.UUCP>
To: resonex!nancy
Subject: Re: Tricks, shell and awk scripts, csh aliases and the like
In-Reply-To: your article <164 at resonex.UUCP>

You asked for it, you've got it!  Here's ALL of my personal nifties:
			Ken
**************************************************

echo x - bin
mkdir bin
echo x - bin/CC
cat >bin/CC <<'!Funky!Stuff!'
#
set outname=a.out
foreach file ($argv)
    if ("$file" =~ *.[cso]) then
	set outname=$file:r
    	break
    endif
end
echo cc -o $outname $*
exec cc -o $outname $*
!Funky!Stuff!
echo x - bin/appt
cat >bin/appt <<'!Funky!Stuff!'
#
set notetype=$0
set notetype=$notetype:t
set notefile=~/.$notetype
# if ($notetype == appt) then
#     set notetype=appointment
#     set notefile=~/calendar
# endif

if ($#argv == 0) then
    test -t 0 && echo Please enter your $notetype entry '(^D to end):'
    echo ' ' >> $notefile
    exec cat >> $notefile
endif

switch ($1)
    case -:
	exec vi $notefile
    case -rm:
	cat /dev/null > $notefile
	exec echo The ${notetype}s are removed.
    case -what:
	exec cat $notefile
    default:
	echo '' >> $notefile
	echo "$*" >> $notefile
endsw
!Funky!Stuff!
echo x - bin/asfix
cat >bin/asfix <<'!Funky!Stuff!'
case $# in
    0)
	file=/tmp/afix$$
	trap "cat $file; rm $file; exit" 0
	trap "rm $file; exit" 3 9
	cat > $file ;;
    1)
	file=$1 ;;
    *)
	echo Usage `basename $0` ' [ <file> ]' ;;
esac
ed - $file << EOF
v/[:\.]/s/^/	/
g/:./s/:/:	/
wq
EOF
!Funky!Stuff!
echo x - bin/atcat
cat >bin/atcat <<'!Funky!Stuff!'
#
if ($#argv < 2) then
    set cmd=$0
    echo Usage: "$cmd:t <time> <word> [ <word> ... ]"
    exit
endif
set atcmd="echo $argv[2-] > `tty`"
at $1 << EOF
$atcmd
EOF
!Funky!Stuff!
echo x - bin/atecho
cat >bin/atecho <<'!Funky!Stuff!'
#
if ($#argv < 2) then
    set cmd=$0
    echo Usage: "$cmd:t <time> <word> [ <word> ... ]"
    exit
endif
set atcmd="echo $argv[2-] > `tty`"
at $1 << EOF
$atcmd
EOF
!Funky!Stuff!
echo x - bin/beautify
cat >bin/beautify <<'!Funky!Stuff!'
#
set TMP=/tmp/cb$$
foreach file (argv)
    echo Beautifying $file:
    cb < $file > $TMP
    cat $TMP > $file
end
rm $TMP
!Funky!Stuff!
echo x - bin/blankclean
cat >bin/blankclean <<'!Funky!Stuff!'
sed -e 's/^	$//' -e 's/ *$//' $*
!Funky!Stuff!
echo x - bin/bphone
cat >bin/bphone <<'!Funky!Stuff!'
phonefile=$HOME/.`basename $0`s

echo ' '

case $# in
    0)
	ed - $phonefile << EOF
g/./s/$/\\
/
g/	/s//\\
/g
g/;/s//	/g
1,\$p
q
EOF
    exit ;;
esac

case $1 in
    -)
	chmod 644 $phonefile
	vi $phonefile
	chmod 444 $phonefile
	exit ;;
esac

trap "rm /tmp/data$$; exit" 0 2
for name
do
    grep -y "$name" $phonefile >> /tmp/data$$
done
ed - /tmp/data$$ << EOF
g/./s/$/\\
/
g/	/s//\\
/g
g/;/s//	/g
1,\$p
q
EOF
!Funky!Stuff!
echo x - bin/catalog
cat >bin/catalog <<'!Funky!Stuff!'
# catalog - produce complete file structure list from directory
# 
# Parameters: 	1: directory name (optional)
# 		2: indentation string (empty on first call)
# 
# Produces on standard output the file structure emanating from
#   the current directory.  Each descent into a subdirectory
#    is indicated by further indentation.  Directories are indicated
#    by surrounding [], and executable files are prefaced with a *.
# 
if ( $#argv == 0) then
   echo "file structure from directory `pwd`"
   date
   echo ''
else
   cd $1
endif
foreach i ( * )
   if ( -d $i ) then
	 echo "${2}[ $i ]"
	 $0 $i "$2  . "
   endif
	 if ( "$i" != '*' ) then
	    if ( -x $i ) then
	       echo "${2} *$i "
	    else
	       echo "${2}  $i "
	    endif
	 endif
   endif
end
!Funky!Stuff!
echo x - bin/circum
cat >bin/circum <<'!Funky!Stuff!'
there=$1
shift
otherstuff="$*"
back=`whoami`
last=`hostname`
IFS='	 !	
'
for link in $there
do
    back="$last!$back"
    last=$link
done
IFS=' 	
'
echo mail $there!$back
(date; echo "$otherstuff") | mail -s "Circumlocution to $last" $there!$back
!Funky!Stuff!
echo x - bin/comfmt
cat >bin/comfmt <<'!Funky!Stuff!'
exec fmt | \
sed -e '1s/^\([	 ]*\)/\1\/\* /' -e '2,$s/^\([	 ]*\)/\1 \* /' -e '${P
s/\*.*/*\//
}'
!Funky!Stuff!
echo x - bin/comstrip
cat >bin/comstrip <<'!Funky!Stuff!'
exec sed -e 's/\/\*//' -e 's/\*\///' -e 's/^[ 	]*\** *//'
!Funky!Stuff!
echo x - bin/decvert
cat >bin/decvert <<'!Funky!Stuff!'
#
if ($#argv == 0) then
    set args=`cat`
    if ($#args != 0) $0 $args
    exit
endif

foreach hexnum ($argv)
dc << EOF
16i
${hexnum}p
EOF
end
!Funky!Stuff!
echo x - bin/f77
cat >bin/f77 <<'!Funky!Stuff!'
PATH=/usr/bin
SPECLIB=/usr/ken/cmd/lib/libc.a
exec f77 "$@" $SPECLIB
!Funky!Stuff!
echo x - bin/famove
cat >bin/famove <<'!Funky!Stuff!'
#
if ($#argv != 2) then
    echo Usage: $0 '<source family root> <destination family root>'
    exit
endif
foreach file ($1.*)
    set suffix=`expr $file : "$1\.\(.*\)"`
    echo mv $file $2.$suffix
    mv $file $2.$suffix
end
if (-e $1) then
    echo mv $1 $2
    mv $1 $2
endif
!Funky!Stuff!
echo x - bin/gredit
cat >bin/gredit <<'!Funky!Stuff!'
#
set CAESAR=/mnt/cad/bin/caesar
set SEARCHPATH=(-p ::/usr/ken/caesar/symlib)
set COLORMAP=(-c mumap.cmap)
set GRTERM=ttyh7
set caesarfile=()
foreach parm ($argv)
    if ($?flag) then
	switch ($flag)
	    case g:
		set GRTERM=$parm
		breaksw
	    case p:
		set SEARCHPATH=(-p "$parm")
		breaksw
	    case R:
		set SEARCHPATH=($SEARCHPATH:$parm)
		breaksw
	    case c:
		set COLORMAP=(-c $parm)
		breaksw
	endsw
	unset flag
	continue
    endif
    if ($parm =~ -*) then
	switch ($parm)
	    case -g:
		set flag=g
		continue
	    case -p:
		set flag=p
		continue
	    case -P:
		set SEARCHPATH=()
		continue
	    case -R:
		set flag=R
		continue
	    case -C:
		set COLORMAP=()
		continue
	    case -c:
		set flag=c
		continue
	endsw
    else
	set caesarfile=($caesarfile $parm)
    endif
end
onintr -
$CAESAR -g $GRTERM $SEARCHPATH $COLORMAP $caesarfile
!Funky!Stuff!
echo x - bin/grindall
cat >bin/grindall <<'!Funky!Stuff!'
#
set flags=
set fileargs=
onintr cleanup
foreach file ($argv)
    if ($file =~ -*) then
	if ($file == -t) then
	    set stdout
	else
	    set flags=($flags $file)
	endif
    else
	set fileargs=($fileargs $file)
    endif
end

if ($?stdout) then
    foreach file ($fileargs)
	vgrind -t $flags $file
    end
else
    foreach file ($fileargs)
	vgrind -t $flags $file >> /usr/tmp/grind$$
    end
    vpr -T $fileargs[1] -t /usr/tmp/grind$$
endif

cleanup:
rm /usr/tmp/grind$$
!Funky!Stuff!
echo x - bin/hardasm
cat >bin/hardasm <<'!Funky!Stuff!'
#
grasm -1 -l -x $* |& pr -f -h "grasm -l -x $*" | vpr -l
!Funky!Stuff!
echo x - bin/hexvert
cat >bin/hexvert <<'!Funky!Stuff!'
#
if ($#argv == 0) then
    set args=`cat`
    if ($#args != 0) $0 $args
    exit
endif

foreach decnum ($argv)
dc << EOF
16o
${decnum}p
EOF
end
!Funky!Stuff!
echo x - bin/job
cat >bin/job <<'!Funky!Stuff!'
PATH=/usr/ken/cmd/bin:/usr/ucb:/bin:/usr/bin
case $# in
    0)
	exec echo Usage: `basename $0` '-;' or $0 '<job description>' ;;
esac
case $1 in
    -)
	exec ex $HOME/.joblog ;;
    -h | -hr | -hrs)
	shift
	hrs=$1
	shift
	exec echo '   job:' $hrs hours # $* >> $HOME/.joblog ;;
    -tail)
	exec tail -22 $HOME/.joblog ;;
    -today)
	{
	    while read line
	    do
		case $line in
		    *login*)
			login="$line" ;;
		esac
	    done
	    echo -n "$login" "for "
	    diffdate "$login" "`date`"
	} < $HOME/.joblog ;;
    -login)
	echo ' login:' "`date`" >> $HOME/.joblog ;;
    -summary)
	cat $HOME/.joblog |
	    while read line
	    do
		case $line in
		    *login*)
			login="$line" ;;
		    *logout*)
			logout="$line"
			echo -n "$login" "for "
			diffdate "$login" "$logout"
		esac
	    done ;;
    *)
	exec echo '   job:' "`date`" # $* >> $HOME/.joblog ;;
esac
!Funky!Stuff!
echo x - bin/ledger
cat >bin/ledger <<'!Funky!Stuff!'
#
set notetype=$0
set notetype=$notetype:t
set notefile=~/.$notetype
# if ($notetype == appt) then
#     set notetype=appointment
#     set notefile=~/calendar
# endif

if ($#argv == 0) then
    test -t 0 && echo Please enter your $notetype entry '(^D to end):'
    echo ' ' >> $notefile
    exec cat >> $notefile
endif

switch ($1)
    case -:
	exec vi $notefile
    case -rm:
	cat /dev/null > $notefile
	exec echo The ${notetype}s are removed.
    case -what:
	exec cat $notefile
    default:
	echo '' >> $notefile
	echo "$*" >> $notefile
endsw
!Funky!Stuff!
echo x - bin/lstree
cat >bin/lstree <<'!Funky!Stuff!'
#
if ($#argv == 0) then
    set root=.
else
    set root=($*)
endif
exec find $root -print | sort | sed -e 's/[^ \/]*\//    /g'
!Funky!Stuff!
echo x - bin/match
cat >bin/match <<'!Funky!Stuff!'
cat $2 |
while read x
do
    for word in $x
    do
	case $word in
	    $1)
		echo $word ;;
	esac
    done
done
!Funky!Stuff!
echo x - bin/narrow
cat >bin/narrow <<'!Funky!Stuff!'
echo \!
!Funky!Stuff!
echo x - bin/outmesg
cat >bin/outmesg <<'!Funky!Stuff!'
#
set notetype=$0
set notetype=$notetype:t
set notefile=~/.$notetype
# if ($notetype == appt) then
#     set notetype=appointment
#     set notefile=~/calendar
# endif

if ($#argv == 0) then
    test -t 0 && echo Please enter your $notetype entry '(^D to end):'
    echo ' ' >> $notefile
    exec cat >> $notefile
endif

switch ($1)
    case -:
	exec vi $notefile
    case -rm:
	cat /dev/null > $notefile
	exec echo The ${notetype}s are removed.
    case -what:
	exec cat $notefile
    default:
	echo '' >> $notefile
	echo "$*" >> $notefile
endsw
!Funky!Stuff!
echo x - bin/path
cat >bin/path <<'!Funky!Stuff!'
IFS="${IFS}:"
for cmddir in $PATH
do
    test -s $cmddir/$1 && echo "	$cmddir/$1"
done
!Funky!Stuff!
echo x - bin/pphone
cat >bin/pphone <<'!Funky!Stuff!'
phonefile=$HOME/.`basename $0`s

echo ' '

case $# in
    0)
	ed - $phonefile << EOF
g/./s/$/\\
/
g/	/s//\\
/g
g/;/s//	/g
1,\$p
q
EOF
    exit ;;
esac

case $1 in
    -)
	chmod 644 $phonefile
	vi $phonefile
	chmod 444 $phonefile
	exit ;;
esac

trap "rm /tmp/data$$; exit" 0 2
for name
do
    grep -y "$name" $phonefile >> /tmp/data$$
done
ed - /tmp/data$$ << EOF
g/./s/$/\\
/
g/	/s//\\
/g
g/;/s//	/g
1,\$p
q
EOF
!Funky!Stuff!
echo x - bin/progression
cat >bin/progression <<'!Funky!Stuff!'
last=
for backup in $1_??
do
    case $last in
	"")
	    last=$backup
	    continue;
    esac
    echo ''
    echo From $last to $backup:
    diff $last $backup
    last=$backup
done
echo ''
echo From $last to $1:
diff $last $1
!Funky!Stuff!
echo x - bin/query
cat >bin/query <<'!Funky!Stuff!'
#
set notetype=$0
set notetype=$notetype:t
set notefile=~/.$notetype
# if ($notetype == appt) then
#     set notetype=appointment
#     set notefile=~/calendar
# endif

if ($#argv == 0) then
    test -t 0 && echo Please enter your $notetype entry '(^D to end):'
    echo ' ' >> $notefile
    exec cat >> $notefile
endif

switch ($1)
    case -:
	exec vi $notefile
    case -rm:
	cat /dev/null > $notefile
	exec echo The ${notetype}s are removed.
    case -what:
	exec cat $notefile
    default:
	echo '' >> $notefile
	echo "$*" >> $notefile
endsw
!Funky!Stuff!
echo x - bin/releave
cat >bin/releave <<'!Funky!Stuff!'
#
set tty=`tty`
set tty=`expr $tty : '.*tty\(.*\)'`
set leaveproc=`ps gt$tty | grep -w leave`
kill -9 $leaveproc[1]
date
leave $*
!Funky!Stuff!
echo x - bin/reminder
cat >bin/reminder <<'!Funky!Stuff!'
#
set notetype=$0
set notetype=$notetype:t
set notefile=~/.$notetype
# if ($notetype == appt) then
#     set notetype=appointment
#     set notefile=~/calendar
# endif

if ($#argv == 0) then
    test -t 0 && echo Please enter your $notetype entry '(^D to end):'
    echo ' ' >> $notefile
    exec cat >> $notefile
endif

switch ($1)
    case -:
	exec vi $notefile
    case -rm:
	cat /dev/null > $notefile
	exec echo The ${notetype}s are removed.
    case -what:
	exec cat $notefile
    default:
	echo '' >> $notefile
	echo "$*" >> $notefile
endsw
!Funky!Stuff!
echo x - bin/reremind
cat >bin/reremind <<'!Funky!Stuff!'
#
set tty=`tty`
set tty=`expr $tty : '.*tty\(.*\)'`
set leaveproc=`ps gt$tty | awk '$5 ~ /^remind$/ { print $1 }'`
if ($#leaveproc > 1) echo $#leaveproc reminds were running
kill -9 $leaveproc
date
if ($#argv <= 1) then
    remind $*
else
    set time=$1
    shift
    remind $time "$*"
endif
!Funky!Stuff!
echo x - bin/restore
cat >bin/restore <<'!Funky!Stuff!'
# Truncate filename if necessary
set file=$1
if (`expr $file:t : '.*'` >= 11) then
    set savename=`expr $file : '\(.*\)'$file:t`
    set savename=$savename`expr $file:t : '\(...........\)'`
else
    set savename=$file
endif

switch ($#argv)
    case 1:
	set nonomatch
	set backup=(${savename}_[0-9][0-9])
	if ("$backup" == "${savename}_[0-9][0-9]") then
	    echo Error: No backups found for $file
	    exit
	endif
	set backup=$backup[$#backup]
	echo No backup number specified. Using latest: $backup
	breaksw
    case 2:
	set backup=${savename}_$2
	breaksw
    default:
	exec echo Usage: `basename $0` '<file>' '[<backup number>]'
endsw

if ( { cp $backup $file } ) then
    echo $file restored from $backup.
    echo -n Do you wish to keep "$backup? "
    set response=$<
    if ($response !~ y*) then
	rm $backup
    endif
endif
!Funky!Stuff!
echo x - bin/rot13
cat >bin/rot13 <<'!Funky!Stuff!'
tr "A-Za-z" "N-ZA-Mn-za-m"
!Funky!Stuff!
echo x - bin/shufcol
cat >bin/shufcol <<'!Funky!Stuff!'
trap 'rm /tmp/$$.*; exit' 0 2
cat > /tmp/$$.0
i=1
for cols
do
    cut -f$cols < /tmp/$$.0 > /tmp/$$.$i
    filelist="$filelist /tmp/$$.$i"
    i=`expr $i + 1`
done
paste $filelist
!Funky!Stuff!
echo x - bin/signature
cat >bin/signature <<'!Funky!Stuff!'
PATH=/bin:/usr/bin
cat
echo --
cat $HOME/.signature
!Funky!Stuff!
echo x - bin/swab
cat >bin/swab <<'!Funky!Stuff!'
#
if ($#argv == 0) then
    dd conv=swab
else
    onintr cleanup
    foreach file ($argv)
	cp $file /tmp/swab$$
	dd if=/tmp/swab$$ of=$file conv=swab
    end
    cleanup:
    rm /tmp/swab$$
endif
!Funky!Stuff!
echo x - bin/what
cat >bin/what <<'!Funky!Stuff!'
cat $HOME/.query
echo -n 'save? (n or d to delete, e to edit) '
read response
case $response in
    n | no | d | delete)
	rm $HOME/.query && echo The query is removed. ;;
    "" | y | yes | s | save)
	exit ;;
    e | edit)
	exec vi $HOME/.query < /dev/tty
	exit ;;
    *)
	echo Bad response: "$response"
	exec $0 ;;
esac
!Funky!Stuff!
echo x - bin/whereis
cat >bin/whereis <<'!Funky!Stuff!'
N=$#
command=echo
case "$1" in
    -*)
	command=`expr "$1" : '-\(.*\)'`
	shift
	N=`expr $N - 1` ;;
esac
case $N in
    0)
	exec echo Usage: `basename $0` [ -command ] pattern file ...  ;;
    1)
	files=`fgrep -l "$1" *` ;;
    *)
	files=`fgrep -l "$@"` ;;
esac
case $files in
	"")
	    echo $1 not found in any files.
	    exit ;;
esac
exec $command $files
!Funky!Stuff!
echo x - bin/wide
cat >bin/wide <<'!Funky!Stuff!'
echo \"
!Funky!Stuff!
echo x - bin/xprint
cat >bin/xprint <<'!Funky!Stuff!'
case $# in
    1)
	eval $1 | eval pr -f -h \"$1\" | vpr -l ;;
    *)
	command='cat $file'
	for file
	do
	    case $file in
		-*)
		    command=`expr "$file" : '-\(.*\)'`
		    case $command in
			*\$file*)
			    ;;
			*)
			    command="$command \$file" ;;
		    esac ;;
		*)
		    eval $command | eval pr -f -h \"$command\" | vpr -l ;;
	    esac
	done
esac
!Funky!Stuff!
echo x - bin/archives
mkdir bin/archives
echo x - bin/archives/newsweed
cat >bin/archives/newsweed <<'!Funky!Stuff!'
#
cd
if ($#argv == 0) then
    if (-e .newsweed) then
	set WEEDGROUPS=`cat .newsweed`
    else
	set WEEDGROUPS=
    endif
else
    set WEEDGROUPS=$*
endif
if ($#WEEDGROUPS == 0) then
    onintr
    echo Searching for articles in all newsgroups
    readnews -l | \
    grep Subject | \
    sed -e 's/Subject: *//' -e 's/^[rR][eE]:*  *//' | \
    sort -u > /tmp/weed$$a
    if (-z /tmp/weed$$a) then
	echo No news.
    else
	cp /tmp/weed$$a /tmp/weed$$b
	echo Please remove article titles which you do not wish to read
	sleep 1
	onintr -
	vi /tmp/weed$$b
	onintr cleanup
	comm -23 /tmp/weed$$a /tmp/weed$$b > /tmp/weed$$c
	echo Removing unwanted articles
	newsec -f /tmp/weed$$c
    endif
else
    foreach group ($WEEDGROUPS)
	echo Searching for articles in group\(s\):
	echo $group
	readnews -l -n $group | \
	grep Subject | \
	sed -e 's/Subject: *//' -e 's/^[rR]e:*  *//' | \
	sort -u > /tmp/weed$$a
	if (-z /tmp/weed$$a) then
	    echo in newsgroups $group.
	else
	    cp /tmp/weed$$a /tmp/weed$$b
	    echo Please remove article titles which you do not wish to read
	    sleep 1
	    onintr -
	    vi /tmp/weed$$b
	    onintr cleanup
	    comm -23 /tmp/weed$$a /tmp/weed$$b > /tmp/weed$$c
	    echo Removing unwanted articles
	    newsec -f /tmp/weed$$c
	endif
    end
endif

cleanup:
rm /tmp/weed$$?
!Funky!Stuff!
echo x - bin/archives/pk_01
cat >bin/archives/pk_01 <<'!Funky!Stuff!'
: Roff, nroff, or eqn input text
for file in `file $* | sed -n '/eqn input text$/s/:[^:]*$//p'`
do
    echo "echo x - $file"
    echo "sed 's/^x//' >$file <<'!Funky!Stuff!'"
    sed 's/^/x/' $file; echo "!Funky!Stuff!"
done
: Text files
for file in `file $* | sed -n -e '/commands text$/s/:[^:]*$//p' -e '/ascii text$/s/:[^:]*$//p'`
do
    echo "echo x - $file"
    echo "cat >$file <<'!Funky!Stuff!'"
    cat $file; echo "!Funky!Stuff!"
done
: Directories, recursively
for dir in `file $* | sed -n '/directory$/s/:.*//p'`
do
    echo "echo x - $dir"
    echo "mkdir $dir"
    file=`echo $dir/*`
    test "$file" != "$dir/*" && $0 $file
done
!Funky!Stuff!
echo x - bin/archives/pkf
cat >bin/archives/pkf <<'!Funky!Stuff!'

for dir
do
	echo "echo x - $dir"
	echo "mkdir $dir";
	for file in `file $dir/* | sed -n '/text$/s/:[^:]*$//p'`
	do
		echo "echo x - $file"
		echo "cat >$file <<'!Funky!Stuff!'"
		cat $file; echo "!Funky!Stuff!"
	done
	$0 `file $dir/* | sed -n '/directory$/s/:.*//p'`
done
!Funky!Stuff!
echo x - bin/archives/pkg
cat >bin/archives/pkg <<'!Funky!Stuff!'
for file
do
    echo "echo x - $file"
    echo "cat >$file <<'!Funky!Stuff!'"
    cat $file; echo "!Funky!Stuff!"
done
!Funky!Stuff!
echo x - bin/archives/pkn
cat >bin/archives/pkn <<'!Funky!Stuff!'

for dir
do
	echo "echo x - $dir"
	echo "mkdir $dir";
	for file in `file $dir/* | sed -n '/text$/s/:[^:]*$//p'`
	do
		echo "echo x - $file"
		echo "sed 's/^x//' >$file <<'!Funky!Stuff!'"
		sed 's/^/x/' $file; echo "!Funky!Stuff!"
	done
	$0 `file $dir/* | sed -n '/directory$/s/:.*//p'`
done
!Funky!Stuff!
echo x - bin/archives/prod
cat >bin/archives/prod <<'!Funky!Stuff!'
#
set flags=()
set syslist=()
foreach arg ($argv)
    switch ($arg)
	case -s*:
	    if (`expr $arg : '.*'` > 9) then
		rm -f /usr/spool/uucp/STST.`expr $arg : '-s\(.......\)'`
	    else
		rm -f /usr/spool/uucp/STST.`expr $arg : '-s\(.*\)'`
	    endif
	    set syslist=($syslist $arg)
	    breaksw
	case -*:
	    set flags=($flags $arg)
	    breaksw
	default:
	    if (`expr $arg : '.*'` > 7) then
		rm -f /usr/spool/uucp/STST.`expr $arg : '\(.......\)'`
	    else
		rm -f /usr/spool/uucp/STST.$arg
	    endif
	    set syslist=($syslist -s$arg)
	    breaksw
    endsw
end
foreach sys ($syslist)
    /usr/lib/uucp/uucico -r1 $flags $sys
end
!Funky!Stuff!
echo x - bin/bourne_scripts
mkdir bin/bourne_scripts
echo x - bin/bourne_scripts/lookdoc
sed 's/^x//' >bin/bourne_scripts/lookdoc <<'!Funky!Stuff!'
xtrap exit 2
xcase $# in
x    0)
x	ul | more
x	exit ;;
xesac
xfor names
xdo
x    case $names in
x	-n)
x	    default=n ;;
x	-t)
x	    default=t ;;
x	-m*)
x	    macros="$macros $names" ;;
x	*.n | *.nr)
x	    nroff $macros $names | ul | more ;;
x	*.t | *.tbl)
x	    soelim $names | tbl | nroff $macros - | ul | more ;;
x	*)
x	    case $default in
x		n)
x		    nroff $macros $names | ul | more ;;
x		t)
x		    soelim $names | tbl | nroff $macros - | ul | more ;;
x		"")
x		    ul $names | more ;;
x	    esac
x    esac
xdone
!Funky!Stuff!
echo x - bin/bourne_scripts/CC
cat >bin/bourne_scripts/CC <<'!Funky!Stuff!'
outname=a.out
for argv
do
    case $argv in
	*.[cos])
	    outname=`expr $argv : '\(.*\)\.'`
	    break ;;
    esac
done
cc -o $outname $*
!Funky!Stuff!
echo x - bin/bourne_scripts/appt
cat >bin/bourne_scripts/appt <<'!Funky!Stuff!'
case $0 in
    appt)
	notetype=appointment
	notefile=$HOME/calendar ;;
    *)
	notetype=$0
	notefile=$HOME/.$0 ;;
esac

case $# in
    0)
	test -t 0 && echo Please enter your $notetype '(^D to end):'
	echo '' >> $notefile
	exec cat >> $notefile ;;
esac
case $1 in
    -)
	exec vi $notefile ;;
    -rm)
	cat /dev/null > $notefile
	exec echo The ${notetype}s are removed. ;;
    -what)
	exec cat $notefile ;;
    *)
	echo '' >> $notefile
	exec echo "$*" >> $notefile ;;
esac
!Funky!Stuff!
echo x - bin/bourne_scripts/beautify
cat >bin/bourne_scripts/beautify <<'!Funky!Stuff!'
for files
do
    echo $files:
    cb < $files > /tmp/cb$$
    cat /tmp/cb$$ > $files
done
rm /tmp/cb$$
!Funky!Stuff!
echo x - bin/bourne_scripts/format
cat >bin/bourne_scripts/format <<'!Funky!Stuff!'
case $# in
    0)
	echo "Usage: `basename $0` [-flags] <filename> [ <filename> ... ]"
	exit 1 ;;
esac
for names
do
    case $names in
	-*)
		flags="$flags $names" ;;
	*.t)
		outfile=`expr $names : '\(.*\)\.'`.d
		soelim $names | tbl | nroff $flags - > $outfile ;;
	*.tbl)
		outfile=`expr $names : '\(.*\)\.'`.doc
		soelim $names | tbl | nroff $flags - > $outfile ;;
	*.n)
		outfile=`expr $names : '\(.*\)\.'`.d
		nroff $flags $names > $outfile ;;
	*.nr)
		outfile=`expr $names : '\(.*\)\.'`.doc
		nroff $flags $names > $outfile ;;
	*)
		echo Don\'t know what to do with $names ;;
    esac
done
!Funky!Stuff!
echo x - bin/bourne_scripts/print
cat >bin/bourne_scripts/print <<'!Funky!Stuff!'
PATH=/avsd/ava/turk/bin:/usr/local/bin:/usr/bin
indent=0
for names
do
    case $names in
	-i)
	    indent=1 ;;
	*)
	    args="$args $names" ;;
    esac
done
case $indent in
    0)
	pr $args | lpr ;;
    *)
	pr $args | indent | lpr ;;
esac
!Funky!Stuff!
echo x - bin/bourne_scripts/repeat
cat >bin/bourne_scripts/repeat <<'!Funky!Stuff!'
case $1 in
    -[0-9]*)
	number=`expr $1 : '-\(.*\)'`
	shift
	while test $number -gt 0
	do
	    eval $*
	    number=`expr $number - 1`
	done
	exit ;;
    *)
	echo Executing forever: $* 1>&2
	number=0
	trap 'echo Executed $number times.; exit' 2
	while true
	do
	    eval $*
	    number=`expr $number + 1`
	done ;;
esac
!Funky!Stuff!
echo x - bin/bourne_scripts/restore
cat >bin/bourne_scripts/restore <<'!Funky!Stuff!'
case $# in
    2) ;;
    *)
	exec echo Usage: `basename $0` '<file>' '<version>' ;;
esac
: Truncate filename if necessary
if test `expr $1 : '.*'` -gt 11
then
    savename=`expr $1 : '\(...........\)'`
else
    savename=$1
fi
savename=${savename}_$2
cp $savename $1 && rm $savename && echo $1 restored from $savename
!Funky!Stuff!
echo x - bin/bourne_scripts/save
cat >bin/bourne_scripts/save <<'!Funky!Stuff!'
for file
do
    if test `expr $file : '.*'` -gt 11
    then
	savename=`expr $file : '\(...........\)'`
    else
	savename=$file
    fi
    for copy in ${savename}_??
    do
	latest=$copy
    done
    if test $latest = "${savename}_??"
    then
	latest=${savename}_01
    else
	latest=`expr $latest : '.*_\([0123456789]*\)$' + 1`
	case $latest in
	    ?)
		latest=0$latest
		;;
	esac
	latest=${savename}_$latest
    fi
    cp $file $latest && echo $file saved as $latest
done
!Funky!Stuff!
echo x - bin/csh_scripts
mkdir bin/csh_scripts
echo x - bin/csh_scripts/newsweed
cat >bin/csh_scripts/newsweed <<'!Funky!Stuff!'
#
set TEMP=/tmp/weed$$
set NEWSRC=~/.newsrc
set AWKFILE=/usr/ken/cmd/lib/newsweed.awk
onintr
echo Searching for articles in all newsgroups
readnews -l $* | sort -o ${TEMP}a
if (-z ${TEMP}a) then
    echo No news.
else
    cp ${TEMP}a ${TEMP}b
    echo Please remove article titles which you do not wish to read
    sleep 1
    onintr -
    vi ${TEMP}b
    onintr cleanup
    if ( { cmp -s ${TEMP}a ${TEMP}b } ) then
	echo No articles deleted.
    else
	comm -23 ${TEMP}a ${TEMP}b | sed 's/ .*//' > ${TEMP}c
	echo Removing unwanted articles
	cp $NEWSRC $NEWSRC.old
	awk -f $AWKFILE $NEWSRC.old ${TEMP}c > ${TEMP}d
	cp ${TEMP}d $NEWSRC
    endif
endif
cleanup:
rm ${TEMP}?
!Funky!Stuff!
echo x - bin/csh_scripts/pathname
cat >bin/csh_scripts/pathname <<'!Funky!Stuff!'
#
foreach cmddir ($path)
    if ( -e $cmddir/$1 ) echo "	$cmddir/$1"
end
!Funky!Stuff!
echo x - bin/local
mkdir bin/local
echo x - bin/local/format
cat >bin/local/format <<'!Funky!Stuff!'
#
if ($#argv == 0) then
    set progname=$0
    set progname=$progname:t
    echo 'Usage:' $progname '[-v] [-n] [-print] [-troffflags] <filename> [ <filename> ... ]'
    exit (1)
endif
set flags
set formatter="vtroff -t"
set eqnsetter=eqn
set docsuf=v
set longdocsuf=vpr
set more=0
foreach name ($argv)
    if ($more > 0) then
	set flags="$flags $name"
	@ more--
	continue
    endif
    switch ($name)
	case -*:
	    switch ($name)
		case -print:
		    set print
		    continue
		case -v:
		    set formatter="vtroff -t"
		    set eqnsetter=eqn
		    set docsuf=v
		    set longdocsuf=vpr
		    continue
		case -n:
		    set formatter=nroff
		    set eqnsetter=neqn
		    set docsuf=d
		    set longdocsuf=doc
		    continue
		case -[F123]:
		    set more=1
		default:
		    set flags="$flags $name"
	    endsw
	    continue
	case *.et:
	    set outfile=$name:r.$docsuf
	    eval soelim $name | tbl | $eqnsetter | $formatter $flags > $outfile
	    breaksw
	case *.t:
	    set outfile=$name:r.$docsuf
	    eval soelim $name | tbl | $formatter $flags > $outfile
	    breaksw
	case *.tbl:
	    set outfile=$name:r.$longdocsuf
	    eval soelim $name | tbl | $formatter $flags > $outfile
	    breaksw
	case *.e:
	    set outfile=$name:r.$docsuf
	    eval $eqnsetter $name | $formatter $flags > $outfile
	    breaksw
	case *.eqn:
	    set outfile=$name:r.$longdocsuf
	    eval $eqnsetter $name | $formatter $flags > $outfile
	    breaksw
	case *.n:
	    set outfile=$name:r.$docsuf
	    eval $formatter $flags $name > $outfile
	    breaksw
	case *.nr:
	    set outfile=$name:r.$longdocsuf
	    eval $formatter $flags $name > $outfile
	    breaksw
	default:
	    echo Don\'t know what to do with $name
	    continue
    endsw
    if ($?print) then
	if ("$formatter" == nroff) then
	    vpr $outfile
	else
	    vpr -t $outfile
	endif
    endif
end
!Funky!Stuff!
echo x - bin/local/lntree
cat >bin/local/lntree <<'!Funky!Stuff!'
PATH=/usr/local/bin:/usr/ucb:/bin:/usr/bin
if test $1 = -v
then
    verbose=1
    shift
else
    verbose=0
fi
case $2 in
    /*)
	target=$2 ;;
    *)
	target=`pwd`/$2 ;;
esac
if test -f $2
then
    echo Error: $2 is not a directory
    exit 1
fi
cd $1
source=`pwd`
if test `expr $target : $source/` != 0
then
    echo Error: $2 may be a subdirectory of $1
    echo Try using the full path name of $2 \(no ..\'s\)
    exit 1
fi
if test $verbose = 1
then
    set -x
fi
files=`type -f`
case $files in
    "") ;;
    *)
	ln $files $target ;;
esac
for directory in `find '' -type d -a -print`
do
    mkdir $target$directory
    cd $source$directory
    files=`type -f`
    case $files in
	"") ;;
	*)
	    ln $files $target$directory ;;
    esac
done
!Funky!Stuff!
echo x - bin/local/lookdoc
cat >bin/local/lookdoc <<'!Funky!Stuff!'
#
if ($#argv == 0) then
	more
	exit
endif
set macros pipespec args
foreach name ($argv)
    switch ($name)
	case -n:
	    set pipespec=n
	    breaksw
	case -t:
	    set pipespec=t
	    breaksw
	case -m*:
	    set macros="$macros $name"
	    breaksw
	case *.n:
	case *.nr:
	    if ($pipespec != t) set pipespec=n
	    set args="$args $name"
	    breaksw
	case *.t:
	case *.tbl:
	    set pipespec=t
	    set args="$args $name"
	    breaksw
	default:
	    set args="$args $name"
    endsw
end

switch ($pipespec)
    case n:
	nroff $macros $args | more
	breaksw
    case t:
	soelim $args | tbl | nroff $macros - | col | more
	breaksw
    default:
	more $name
	breaksw
endsw
!Funky!Stuff!
echo x - bin/local/newsweed
cat >bin/local/newsweed <<'!Funky!Stuff!'
TEMP=/tmp/weed$$
NEWSRC=$HOME/.newsrc
AWKFILE=/usr/local/lib/newsweed.awk
trap 'rm ${TEMP}?; exit' 0 2
echo Making list of article titles
readnews -l $* | sort -o ${TEMP}a
if test -s ${TEMP}a
then
    cp ${TEMP}a ${TEMP}b
    echo Please remove article titles which you do not wish to read
    sleep 1
    reset	# So that vi's CRLF doesn't get trashed by another vi
    ${EDITOR-vi} ${TEMP}b
    if cmp -s ${TEMP}a ${TEMP}b
    then
	echo No articles deleted.
    else
	comm -23 ${TEMP}a ${TEMP}b | sed 's/ .*//' > ${TEMP}c
	echo Removing unwanted articles
	cp $NEWSRC $NEWSRC.old
	awk -f $AWKFILE $NEWSRC.old ${TEMP}c > ${TEMP}d
	cp ${TEMP}d $NEWSRC
    fi
else
    echo No news.
fi
!Funky!Stuff!
echo x - bin/local/nmail
cat >bin/local/nmail <<'!Funky!Stuff!'
#/bin/csh
set found = 0
set arg = 1
while($arg <= $#argv)
	if(`echo $argv[$arg] | grep \!` != "") then
		set tuple = `echo $argv[$arg] | sed s/\\!/\ /`
		set upath = `uupath $tuple[1]`
		set found = $status
		set argv[$arg] = "$upath\!$tuple[2]"
	else
		set found = 0
	endif
	if($found != 0) then
		set argv[$arg]
	endif
	@ arg = $arg + 1
end
echo "mail $argv"
mail $argv

!Funky!Stuff!
echo x - bin/local/peopledata
cat >bin/local/peopledata <<'!Funky!Stuff!'
peoplefile=$HOME/.peopledata

echo ' '

case $# in
    0)
	ed - $peoplefile << EOF
g/./s/$/\\
/
g/	/s//\\
/g
1,\$p
q
EOF
    exit ;;
esac

case $1 in
    -)
	chmod 600 $peoplefile
	vi $peoplefile
	chmod 400 $peoplefile
	exit ;;
esac
trap "rm /tmp/data$$; exit" 0 2
for name
do
    grep -y "$name" $peoplefile >> /tmp/data$$
done
ed - /tmp/data$$ << EOF
g/./s/$/\\
/
g/	/s//\\
/g
1,\$p
q
EOF
!Funky!Stuff!
echo x - bin/local/phone
cat >bin/local/phone <<'!Funky!Stuff!'
peoplefile=$HOME/.peopledata

case $# in
    0)
	ed - $peoplefile << EOF
	v/-/d
	g/./s/\([^	]*\)[^-]*	\(.*-.*\)/\1	\2/
	1,\$p
EOF
	exit ;;
esac

case $1 in
    -)
	chmod 600 $peoplefile
	vi $peoplefile
	chmod 400 $peoplefile
	exit ;;
esac

trap "rm /tmp/data$$; exit" 0 2
for name
do
    grep -y "$name" $peoplefile >> /tmp/data$$
done
ed - /tmp/data$$ << EOF
g/./s/\([^	]*\)[^-]*	\(.*-.*\)/\1	\2/
1,\$p
q
EOF
!Funky!Stuff!
echo x - bin/local/pk
cat >bin/local/pk <<'!Funky!Stuff!'
for dir
do echo "mkdir $dir";
	for file in `file $dir/* | sed -n '/text$/s/:[^:]*$//p'`
	do	echo "echo x - $file"
		echo "cat >$file <<'#EOF#'"
		cat $file; echo "#EOF#"
	done
	pk `file $dir/* | sed -n '/directory$/s/:.*//p'`
done
!Funky!Stuff!
echo x - bin/local/save
cat >bin/local/save <<'!Funky!Stuff!'
#
if ("$1" =~ -*) then
    set suffix=`expr $1 : '-\(.*\)'`
    shift
    foreach file ($argv)
	if (`expr $file:t : '.*'` >= 11) then
	    set savename=`expr $file : '\(.*\)'$file:t`
	    set savename=$savename`expr $file:t : '\(...........\)'`
	else
	    set savename=$file
	endif
	cp $file ${savename}_$suffix && \
		echo $file saved as ${savename}_$suffix
    end
    exit
endif
foreach file ($argv)
    if (`expr $file:t : '.*'` >= 11) then
	set savename=`expr $file : '\(.*\)'$file:t`
	set savename=$savename`expr $file:t : '\(...........\)'`
    else
	set savename=$file
    endif

    set nonomatch
    set latest=(${savename}_[0-9][0-9])
    if ("$latest" == "${savename}_[0-9][0-9]") then
	set latest=${savename}_01
    else
	set latest=$latest[$#latest]
	set latest=`expr $latest : '.*_\([0123456789]*\)$' + 1`
	if ($latest < 10) set latest=0$latest
	set latest=${savename}_$latest
    endif
    cp $file $latest && echo $file saved as $latest
end
!Funky!Stuff!
echo x - bin/local/shar
cat >bin/local/shar <<'!Funky!Stuff!'
: Roff, nroff, or eqn input text
for file in `file $* | sed -n '/eqn input text$/s/:[^:]*$//p'`
do
    echo "echo x - $file"
    echo "sed 's/^x//' >$file <<'!Funky!Stuff!'"
    sed 's/^/x/' $file; echo "!Funky!Stuff!"
done
: Text files
for file in `file $* | sed -n -e '/eqn input text$/d' -e '/text$/s/:[^:]*$//p'`
do
    echo "echo x - $file"
    echo "cat >$file <<'!Funky!Stuff!'"
    cat $file; echo "!Funky!Stuff!"
done
: Directories, recursively
for dir in `file $* | sed -n '/directory$/s/:.*//p'`
do
    echo "echo x - $dir"
    echo "mkdir $dir"
    file=`echo $dir/*`
    test "$file" != "$dir/*" && $0 $file
done
!Funky!Stuff!
echo x - bin/local/uuhosts
cat >bin/local/uuhosts <<'!Funky!Stuff!'
#!/bin/sh
# '@(#) uuhosts.sh 1.22 84/08/07'

# PATH will have to be adjusted for non-BSD systems.
PATH=/usr/local/bin:/usr/ucb:/bin:/usr/bin
LIB=/usr/lib

# Routing information produced by pathalias.
paths=$LIB/nmail.paths

# The directory $NEWSMAP should contain the USENET news map information
# from newsgroup net.news.map that is posted about once a month from
# cbosgd!map, extracted by a line like this in $LIB/news/sys:
#
#	newsmap:net.news.map:B:/usr/local/uuhosts -x
#
# Locally-known information should go in $LIB/news/net.news.map/Local.
# The directory $MAILMAP is extracted by the same command from the
# UUCP mail information posted to the same newsgroup.
NEWSMAP=$LIB/news/net.news.map
MAILMAP=$LIB/news/net.mail.map
cd $NEWSMAP

case $1 in
	-x)
		# extract a new map piece into the map directory
		temphead=/tmp/maphead.$$
		temptext=/tmp/maptext.$$
		awk '
BEGIN	{
	temphead = "'$temphead'";
	isnewsmap = 0; ismailmap = 0;
	shead = 0; stext = 1; snews = 2; smail = 3; scat = 4; scatting = 5;
	state = shead;
	print "Reply-To: news" >> temphead;
}
state == shead && /^From: /	{
	print "Original-" $0 >> temphead;
}
state == shead && /^Subject: /	{
	if ($2 != "Re:")
	for (x = 2; x <= NF; x++) {
		if ($x == "UUCPmap" || $x == "uucpmap" || $x == "UUCPMAP") {
			ismailmap = 1;
			break;
		}
		if ($x == "map" || $x == "Map" || $x == "MAP") {
			if (x <= 2)
				continue;
			x--;
			if ($x == "USENET") {
				isnewsmap = 1;
				break;
			}
			if ($x == "UUCP") {
				ismailmap = 1;
				break;
			}
			x++;
		}
	}
	if (!isnewsmap && !ismailmap) {
		print "Subject:  not a map update" >> temphead;
		print "Original-" $0 >> temphead;
	} else
		print $0 >> temphead;
}
state == shead && /^$/	{
	if (isnewsmap != 0)
		state = snews;
	else if (ismailmap != 0) {
		state = scat;
	} else
		state = stext;
	next;
}
state == scat	{
	if ($1 != "cat")
		state = scatting;
	else
		state = smail;
}
state == scatting {
	if ($1 == ":")
		state = smail;
	else
		print;
}
state == smail	{
	print | "uuhosts -u";
}
state == snews	{
	print | "/bin/sh";
}
state == stext	{
	print;
}
' > $temptext 2>&1
		cat $temphead $temptext | /bin/mail news
		rm -f $temphead $temptext
		exit 0
	;;

	-u)
		# extract a UUCP map piece
		cd $MAILMAP
		/bin/sh
		for f in *map*.a *map*.ar
		do
			ar xv $f
			rm $f
		done
	;;

	-g)
		# by geographical region
		shift
		if test $# -eq 0
		then
			exec ls
			exit 1
		fi
		exec cat $*
		exit 1
	;;

	-k)
		# by keyword
		shift
		exec awk '
BEGIN		{ inside = 1; outside = 0; state = outside; }
/^Name:/	{ state = inside; count = 0; useit = 0; }
state == inside	{ block[count++] = $0; }
/'"$*"'/	{ useit = 1; }
/^$/ && state == inside	{
	if (useit == 1) {
		for (i = 0; i < count; i++) {
			print block[i];
		}
	}
	state = outside;
}
' *
		exit 1
	;;

	-*)
		# unknown option
	;;

	"")
		# no arguments
	;;

	*)
		# by site name
		for arg in $*
		do
			echo 'UUCP mail path:'
			grep '^'${arg} $paths
			echo '
UUCP mail host information:'
			cat $MAILMAP/${arg}* | tr % '\012'
			echo '
USENET news host information:'
			sed -n -e "/^Name:[ 	]*${arg}/,/^$/p" *
		done
		exit 0
	;;
esac

echo 'Usage:	'uuhosts' hostname ...
for information about a particular UUCP or USENET host or hosts, or

	'uuhosts' -g geographical-region
for information about USENET news sites in a geographical region, or

	'uuhosts' -g
for a list of known USENET geographical-regions.
'
exit 1
!Funky!Stuff!

::::::::::::::
shells/4
::::::::::::::
Return-Path: <hplabs!sdcrdcf!sdcsvax!celerity!barto>
Received: by resonex.UUCP (4.12/4.7)
	id AA24828; Fri, 14 Sep 84 23:18:19 pdt
Received: by HP-VENUS id AA07506; Fri, 14 Sep 84 20:11:43 pdt
Received: by sdcrdcf.UUCP (4.12/4.7)
	id AA20899; Fri, 14 Sep 84 19:31:20 pdt
Received: by sdcsvax.UCSD; Fri, 14 Sep 84 15:39:44 pdt
Received: by celerity.CELERIT (1.0celerity)
	   Fri, 14 Sep 84 15:06:07 pdt
Date: Fri, 14 Sep 84 15:06:07 pdt
Message-Id: <8409142206.AA00452 at celerity.CELERIT>
From: hplabs!sdcrdcf!sdcsvax!celerity!barto (David Barto)
To: sdcsvax!sdcrdcf!hplabs!resonex!nancy
Subject: Re: Tricks, shell and awk scripts, csh aliases and the like
References: <164 at resonex.UUCP>

Hi Nancy,
	I too am a 'new' system admin, and belive me, it won't take
	you too long to get quite a bag of tricks put together.

	Most of mine relate to source programs put together in
	shell scripts to keep track of things.

	I have 1 for news (at the end of the article) which keeps
	the active list up to date.

	Another nice program is one I call '#'.  It is owned by root
	and setuid/setgid to root/daemon.  I use it to 'become' root
	while doing 1 command
			# mv file1 file2
	which requires root permission.  It checks to see the normal
	userid is 'me' and then allows the command.  I will send it
	along if you want it.

	I have shell scripts for doing things such as 'rootedit'
	a file.  This is an alias for "alias re  '# vi -v \!*'"

	I too would love to see the things you get back from the
	net.  As well I have a sendmail config setup for making
	your configuration a breeze.  If you want it I can send
	it under seperate cover.


	barto (david barto)	Tele : (619) 271 9940
	uucp : {decvax || ucbvax || ihnp4}!sdcsvax!celerity!barto
	uucp : akgua!celerity!barto
	arpa : sdcsvax!celerity!barto at NOSC


: This is a shar archive.  Extract with sh, not csh.
echo x - Mkactive
cat > Mkactive << '!Funky!Stuff!'
#!/bin/sh
# see Update.active for this usage
#
sed -e '1,/---/d'\
	-e '1,/---/d'\
	-e 's/^[	]//'\
	-e 's/	\(.*\)//'\
	active.current | sort | sed -e '1,/Newsgroup/d' > current
sed -e 's/ \(.*\)//' /usr/new/lib/news/active | sort > active
diff active current > /tmp/active.diff
echo "# active newsgroups not in local active file:"
fgrep ">" /tmp/active.diff
echo "# defunct newsgroups still in active file (also local groups):"
fgrep "<" /tmp/active.diff
/bin/rm current active /tmp/active.diff
!Funky!Stuff!
echo x - Mkdead
cat > Mkdead << '!Funky!Stuff!'
#!/bin/sh
# see Update.active for usage
# change all groups that we have (but shouldn't) to be removed,
# and change all groups that we dont have (but sould) to be a comment
sed	-e '/general/d'\
	-e '/control/d' \
	-e '/junk/d' \
	-e 's/</rmgroup/' \
	-e 's/>/#/'
!Funky!Stuff!
echo x - rmgroup
cat > rmgroup << '!Funky!Stuff!'
#! /bin/sh
# from : sdcsvax!sdcrdcf!hplabs!hao!seismo!rlgvax!cvl!umcp-cs!eneevax!chris
#
# @(#)rmgroup.sh	(U of Maryland) FLB 28-Jun-1983
#			Bug fixes 5 June 1984 Chris Torek
#
# Delete a newsgroup

lib=/usr/new/lib/news
spool=/usr/spool/news

group=$*

for group
do
	qgrp="`echo $group | sed 's/\./\\\./g'`"
	if
		grep -s "^$qgrp [0-9][0-9][0-9][0-9][0-9]$" $lib/active
	then
		ed - $lib/active << xxxFOOxxx
/^$qgrp [0-9][0-9][0-9][0-9][0-9]$/d
w
q
xxxFOOxxx
	else
		echo "$0: $group: no such active line" 2>&1
	fi

	dir=$spool/"`echo $group | sed 's/\./\//g'`"
	if
		[ -d "$dir" ]
	then
		/bin/rm -fr "$dir"
	else
		echo "$0: $dir: no spool directory" 2>&1
	fi
done
exit 0
!Funky!Stuff!

::::::::::::::
shells/5
::::::::::::::
Return-Path: <turtlevax!ken>
Received: by resonex.UUCP (4.12/4.7)
	id AA04145; Thu, 20 Sep 84 02:17:08 pdt
Received: by turtlevax.UUCP (4.12/4.1)
	id AA02255; Thu, 20 Sep 84 01:20:29 pdt
Date: Thu, 20 Sep 84 01:20:29 pdt
From: turtlevax!ken (Ken Turkowski)
Message-Id: <8409200820.AA02255 at turtlevax.UUCP>
To: resonex!nancy
Subject: Handy new uucp utility: uuque

cat << EOF
I just completed a new useful uucp utility which lets you know what kind
of uucp work is in progress.  While uusnap just tells you the number of
files to be processed, uuque tells you exactly what kind of work is to
be performed.  I've only tried it on three kinds of work, namely mail,
news, and standard uucp transfers.  Give it a try, and see if it breaks
on any new types of uucp work.
				Ken
P.S. This really should be a C program.
EOF
echo x - uuque
cat >uuque <<'!Funky!Stuff!'
#! /bin/sh
# uusnap
cd /usr/spool/uucp
LUUNAME=`uuname -l`

# Check for outgoing work
for cmdfile in C./*
do
    test -f $cmdfile || continue
    othersys=`expr $cmdfile : 'C./C.\(.*\).....'`
    cmd=
    dfile=
    xfile=
    ufile=
    cat $cmdfile | {
	while read cmd arg1 arg2 arg3 extra
	do
	    case $cmd in
		S) ;;
		*)  echo Bad cmd in $cmdfile: $cmd $arg1 $arg2 $arg3 $extra
		    exit ;;
	    esac
	    case $arg1 in
		D.${LUUNAME}X????)	# Remote execute file
		    xfile=$arg1
		    ;;
		D.${LUUNAME}?????)	# Data file ref'd by the execute file
		    dfile=$arg1
		    ;;
		*)			# Just a uucp
		    dfile=$arg1
		    ufile=$arg2
		    from=$arg3
		    ;;
	    esac
	done
	case $xfile in
	    "")			# uucp transfer
		echo `wc -c < $dfile`\	 uucp $dfile $othersys!$ufile \($from\)
		;;
	    *)			# complex transfer
		cat D.${LUUNAME}X/$xfile | {
		    while read xcmd arg1 arg2 extra
		    do
			case $xcmd in
			    U)
				from=$arg2!$arg1
				;;
			    F)
				;;
			    I)
				;;
			    C)
				echo `wc -c < D.${LUUNAME}/$dfile`\	 $arg1 $othersys!$arg2 \($from\)
				;;
			    *)
				echo Unknown xcmd in $xfile: $xcmd $arg1 $arg2
				exit
				;;
			esac
		    done
		}
		;;
	esac
    }
done

# Check for incoming work
for cmdfile in X./*
do
    test -f $cmdfile || continue
    othersys=`expr $cmdfile : 'X./X.\(.*\).....'`
    cat $cmdfile | {
	while read cmd arg1 arg2 extra
	do
	    case $cmd in
		U)
		    from=$arg2!$arg1
		    ;;
		Z)
		    ;;
		F)
		    if test -f D./$arg1
		    then
			dfile=D./$arg1
		    elif test -f D./$arg2
		    then
			dfile=D./$arg2
		    else
			continue 2
		    fi
		    ;;
		C)
		    xcmd=$arg1
		    ;;
		*)  echo Bad cmd in $cmdfile: $cmd $arg1 $arg2 $extra
		    exit ;;
	    esac
	done
	echo `wc -c < $dfile`\	 $xcmd $dfile \($from\)
    }
done
!Funky!Stuff!

::::::::::::::
shells/6
::::::::::::::
Return-Path: <turtlevax!ken>
Received: by resonex.UUCP (4.12/4.7)
	id AA23344; Sat, 22 Sep 84 09:18:26 pdt
Received: by turtlevax.UUCP (4.12/4.1)
	id AA10182; Sat, 22 Sep 84 01:22:39 pdt
Date: Sat, 22 Sep 84 01:22:39 pdt
From: turtlevax!ken (Ken Turkowski)
Message-Id: <8409220822.AA10182 at turtlevax.UUCP>
To: resonex!nancy
Subject: Re:  uuque 

I've updated uuque to the point where it should probably instead be called
uusnoop.  Of course, it's not that interesting unless there are others on
your system that use uucp and net mail.

			Ken

echo x - uuque
cat >uuque <<'!Funky!Stuff!'
#! /bin/sh
# The user must have access to the /usr/spool/uucp/* directories and files.
# This can be easily done by making certain users members of the daemon
# and/or uucp groups, or by becoming super-user.
# uusnap
cd /usr/spool/uucp
LUUNAME=`uuname -l`

# Check for outgoing work
for cmdfile in C./*
do
    test -f $cmdfile || continue
    othersys=`expr $cmdfile : 'C./C.\(.*\).....'`
    cmd=
    dfile=
    xfile=
    ufile=
    cat $cmdfile | {
	while read cmd arg1 arg2 arg3 extra
	do
	    case $cmd in
		S)				# uucp send
		    case $arg1 in
			D.${LUUNAME}X????)	# Remote execute file
			    xfile=$arg1
			    ;;
			D.${LUUNAME}?????)	# Data file ref'd by xfile
			    dfile=D.${LUUNAME}/$arg1
			    ;;
			*)		# Just a uucp -- no intertpretation
			    echo `wc -c < $arg1`\	 uucp $arg1 $othersys!$arg2 \($arg3\)
			    ;;
		    esac
		    ;;
		R)		# uucp receive
		    echo '	' uucp $othersys!$arg1 $arg2 \($arg3\)
		    ;;
		*)  echo Bad cmd in $cmdfile: $cmd $arg1 $arg2 $arg3 $extra
		    continue ;;
	    esac
	done
	case $xfile in
	    "")			# uucp transfer
		continue
		;;
	esac
	cat D.${LUUNAME}X/$xfile | {	# complex transfer -- interpret xfile
	    while read xcmd arg1 arg2 extra
	    do
		case $xcmd in
		    U)
			from=$arg2!$arg1
			;;
		    F)
			;;
		    I)
			;;
		    Z)
			;;
		    C)
			case $arg1 in
			    rmail)
				from=`head -1 $dfile | ( read arg1 arg2 extra; echo $arg2 )`
				echo `wc -c < $dfile`\	 $arg1 $othersys!$arg2 \($from\)
				echo -n '	 '
				grep '^Subject:' $dfile || echo ''
				;;
			    rnews)
				echo `wc -c < $dfile`\	 $arg1 $othersys  \($from\)
				echo -n '	 '
				grep '^Newsgroups:' $dfile
				echo -n '	 '
				grep '^Subject:' $dfile
				;;
			    *)
				echo `wc -c < $dfile`\	 $arg1 $arg2 $extra [$othersys $dfile] \($from\)
				;;
			esac
			;;
		    *)
			echo Unknown xcmd in $xfile: $xcmd $arg1 $arg2
			exit
			;;
		esac
	    done
	}
    }
done

# Check for incoming work
for cmdfile in X./*
do
    test -f $cmdfile || continue
    othersys=`expr $cmdfile : 'X./X.\(.*\).....'`
    comment=
    cat $cmdfile | {
	while read cmd arg1 arg2 extra
	do
	    case $cmd in
		U)
		    from=$arg2!$arg1
		    ;;
		Z)
		    ;;
		I)
		    ;;
		F)
		    if test -f D./$arg1
		    then
			dfile=D./$arg1
		    elif test -f XTMP/$arg2
		    then
			dfile=XTMP/$arg2
			comment="(EXECUTING)"
		    else
			continue 2
		    fi
		    ;;
		C)
		    xcmd=$arg1
		    xargs="$arg2 $extra"
		    case $arg1 in
			rmail)
			    from=$othersys!`head -1 $dfile | ( read arg1 arg2 extra; echo $arg2 )`
			    echo -n '	 '
			    grep '^Subject:' $dfile || echo ''
			    ;;
		    esac
		    ;;
		*)  echo Bad cmd in $cmdfile: $cmd $arg1 $arg2 $extra
		    continue ;;
	    esac
	done
	echo `wc -c < $dfile`\	 $xcmd $xargs $comment \($from\)
    }
done
!Funky!Stuff!



More information about the Comp.unix.wizards mailing list