Contributed by Tom Van Raalte
I thought you might want to use the following script around the office. It is a preprocessor for lpr that sends output to the "best" printer. [This shell script is written for a BSD or Linux system and you would use this command in place of lpr. It reads the output of the lpq command to determine if a specific printer is available. If not, it tries a list of printers to see which one is available or which is the least busy. Then it invokes lpr to send the job to that printer.]
#!/bin/sh
#
#set up temp file
TMP=/tmp/printsum.$$
LASERWRITER=${LASERWRITER-ps6}
#Check to see if the default printer is free?
#
#
FREE=`lpq -P$LASERWRITER | awk '
{ if ($0 == "no entries")
{
val=1
print val
exit 0
}
else
{
val=0
print val
exit 0
}
}'`
#echo Free is $FREE
#
#If the default is free then $FREE is set, and we print and exit.
#
if [ $FREE -eq 1 ]
then
SELECT=$LASERWRITER
#echo selected $SELECT
lpr -P$SELECT $*
exit 0
fi
#echo Past the exit
#
#Now we go on to see if any of the printers in bank are free.
#
BANK=${BANK-$LASERWRITER}
#echo bank is $BANK
#
#If BANK is the same as LASERWRITER, then we have no choice.
#otherwise, we print on the one that is free, if any are free.
#
if [ "$BANK" = "$LASERWRITER" ]
then
SELECT=$LASERWRITER
lpr -P$SELECT $*
exit 0
fi
#echo past the check bank=laserprinter
#
#Now we check for a free printer.
#Note that $LASERWRITER is checked again in case it becomes free
#during the check.
#
#echo now we check the other for a free one
for i in $BANK $LASERWRITER
do
FREE=`lpq -P$i | awk '
{ if ($0 == "no entries")
{
val=1
print val
exit 0
}
else
{
val=0
print val
exit 0
}
}'`
if [ $FREE -eq 1 ]
then
# echo in loop for $i
SELECT=$i
# echo select is $SELECT
# if [ "$FREE" != "$LASERWRITER" ]
# then
# echo "Output redirected to printer $i"
# fi
lpr -P$SELECT $*
exit 0
fi
done
#echo done checking for a free one
#
#If we make it here then no printers are free. So we
#print on the printer with the least bytes queued.
#
#
for i in $BANK $LASERWRITER
do
val=`lpq -P$i | awk ' BEGIN {
start=0;
}
/^Time/ {
start=1;
next;
}
(start == 1){
test=substr($0,62,20);
print test;
} ' | awk '
BEGIN {
summ=0;
}
{
summ=summ+$1;
}
END {
print summ;
}'`
echo "$i $val" >> $TMP
done
SELECT=`awk '(NR==1) {
select=$1;
best=$2
}
($2 < best) {
select=$1;
best=$2}
END {
print select
}
' $TMP `
#echo $SELECT
#
rm $TMP
#Now print on the selected printer
#if [ $SELECT != $LASERWRITER ]
#then
# echo "Output redirected to printer $i"
#fi
lpr -P$SELECT $*
trap 'rm -f $TMP; exit 99' 2 3 15For the most part, we've avoided scripts like these in which most of the logic is coded in the shell script. However, such a minimalist approach is representative of a wide variety of uses of awk. Here, awk is called to do only those things that the shell script can't do (or do as easily). Manipulating the output of a command and performing numeric comparisons is an example of such a task.
As a side note, the trap statement at the end should be at the top of the script, not at the bottom.