bill@twg.bc.ca (bill) (01/24/91)
I've got a good one for the gurus. I have a Bourne script that
checks our modem lines when there are no modems available to
determine who is using which modem and have they been dormant for
any length of time.
I use the /usr/spool/uucp/LCK..ttyi1x lock file (we use Digiboard
and the ports are ttyi1[a-z,A-Z] to determine which modem ports
are in use. Since the lock file for port P (using modem control
devices) becomes LCK..ttyi1p (lower case p), my script wants to
check the access time for /dev/ttyi1p, instead of /dev/ttyi1P.
Is there any way, when you have something like Port=ttyi1p, that
you can map lower case letters in the variable value to upper
case? If it can be done, the next step would be to prevent the
"i" from getting mapped and only map the last letter (p) to upper
case (P).
My kludge at this stage is:
case $Port in
i1o) real_port=i1O;;
i1p) real_port=i1P;;
esac
I would love to be able to do something as simple as:
case $Port in
i1[a-z]) real_port=i1[A-Z];;
esac
but I doubt life would be that kind to me. Any ideas?
--
Bill Irwin - The Westrheim Group - Vancouver, BC, Canada
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
uunet!van-bc!twg!bill (604) 431-9600 (voice) | UNIX Systems
bill@twg.bc.ca (604) 430-4329 (fax) | Integrationqpliu@phoenix.princeton.edu (q.p.liu) (01/24/91)
In article <530@twg.bc.ca> bill@twg.bc.ca (bill) writes: >My kludge at this stage is: >case $Port in > i1o) real_port=i1O;; > i1p) real_port=i1P;; >esac >I would love to be able to do something as simple as: >case $Port in > i1[a-z]) real_port=i1[A-Z];; >esac >but I doubt life would be that kind to me. Any ideas? If you don't mind lots of processes, real_port=i1`echo $Port | cut -c3- | tr a-z A-Z` or maybe, real_port=`echo $Port | cut -c-2``echo $Port | cut -c3- | tr a-z A-Z`
]) (01/25/91)
How about:
real_port=`echo "$Port" | sed 's/p$/P/'`
If you *know* that the only character you need to change is a trailing
lowercase-p into a Capital-P, that'll do it.
In fact, if you're walking all of the lock-files and, let's say, you
need to nail two characters, both trailing lowers (p and x) into
Caps (P and X):
ls /usr/spool/uucp/LCK..tty* 2>/dev/null |
sed -e 's/p$/P/' \
-e 's/x$/X/' |
while read lockfile
do
: # Whatever
done
or
for lockfile in `ls /usr/spool/uucp/LCK..tty* 2>/dev/null |
sed -e 's/p$/P/' -e 's/x$/X/'`
do
: # process this lockfile
done
Redirecting stderr to /dev/null on the ls command avoids stderr from
the script when there just happen to be no tty lockfiles.
It wasn't clear to me whether you've got lowercase last characters
and need to switch 'em to Caps or you've got Caps and need to switch
them to lowercase. Obviously, if you need to go from Caps to lower,
you'll need to reverse the characters in the sed edits I list above.
Here's an extension to make the /dev/tty filename out of the lockfile
name. I just thought of this...
Assumption: lockfiles ending in lowercase letters need to be
converted to last-character-lower to get the ttyname.
#
# The sed script does the following:
# load the hold space with the lockfile name
# delete from ^ through "LCK.."
# switch trailing lower-[px] to Cap-[PX]
# insert /dev/ to make the device filename
# append the lockfile name from the hold space
# replace the newline (from G) with a blank
#
ls /usr/spool/uucp/LCK..tty* 2>/dev/null |
sed -e 'h' \
-e 's/.*LCK..//' \
-e 's/p$/P/' \
-e 's/x$/X/' \
-e 's,^,/dev/,' \
-e 'G' \
-e 's/\n/ /' |
while read device lockfile
do
:
done
...Kris
--
Kristopher Stephens, | (408-746-6047) | krs@uts.amdahl.com | KC6DFS
Amdahl Corporation | | |
[The opinions expressed above are mine, solely, and do not ]
[necessarily reflect the opinions or policies of Amdahl Corp. ]rad@genco.bungi.com (Bob Daniel) (01/26/91)
In article <530@twg.bc.ca> bill@twg.bc.ca (bill) writes: >Is there any way, when you have something like Port=ttyi1p, that >you can map lower case letters in the variable value to upper >case? If it can be done, the next step would be to prevent the >"i" from getting mapped and only map the last letter (p) to upper >case (P). > >case $Port in > i1[a-z]) real_port=i1[A-Z];; >esac > You can extract the third letter in Port and then pipe it to 'tr [a-z] [A-Z]' to convert it to upper case.
stuart@amc-gw.amc.com (Stuart Poulin) (01/26/91)
#!/bin/sh
# Here's a couple of fun ways to translate the last char to upper
# case.
# These work for any last character of a-z.
# First, the little used expr.
Port=i1o
case $Port in
i1[a-z]) tmp_port=`expr "$Port" : '\(.*\).'`
Port=$tmp_port`expr "$Port" : '.*\(.\)' | tr 'a-z' 'A-Z' `
;;
esac
echo $Port
# Or using associative arrays in awk. (this even works in old awk).
# I seem to do a lot of char translations this way.
#( I used a sh function to simplify the case statement.)
ToUpperLastChar() {
echo $*|
awk '
BEGIN {
# build an associate array to do the translation
split("a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z",\
low_alpha,",")
split("A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z",\
high_alpha,",")
for ( i = 1 ; i < 26 ; i++){
trans[low_alpha[i]] = high_alpha[i]
trans[high_alpha[i]] = low_alpha[i]
}
}
{
StrLen=length($0)
print substr($0,1,StrLen - 1) trans[substr($0,StrLen)]
}'
}
Port=i1o
case $Port in
i1[a-z]) Port=`ToUpperLastChar "$Port`
;;
esac
echo $Portbill@twg.bc.ca (Bill Irwin) (01/26/91)
I asked for a way to convert the name of a uucp lock file into
its upper case counterpart /dev device name. Since you don't
know which modem ports might be in use, those solutions that had
a particular letter "wired" in have limited value.
I received several mailed responses. The simplest and most
easily understandable (by me), provided by Stuart Hood, follows:
case $modem in
i[1-9][a-z])
real_modem=i`echo $modem | sed 's/i//' | tr '[a-z]' '[A-Z]'`
;;
esac
--
S I E M E N S Stuart Hood 65-73 Crockhamwell Road, Woodley, Berkshire, UK
------------- Phone: + 44-734-691994 Email: stuart@siesoft.co.uk
N I X D O R F The trouble with everyone, is that they generalise too much
I decided to tune it a little bit because when another Digiboard
is added, the ports names are "ttyi2x". I would like the script
to handle all ports regardless of board number.
This is clean and elegant. You (Net) have probably saved me
hours of reading about sed in the manual, and I may never have
stumbled across tr. Now that I know what these utilities can do,
the next time I have a similar problem I can research it in the
manual.
I think the Net is wonderful for these types of things. Thanks
to all who responded.
--
Bill Irwin - The Westrheim Group - Vancouver, BC, Canada
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
uunet!van-bc!twg!bill (604) 431-9600 (voice) | Your Computer
bill@twg.bc.ca (604) 430-4329 (fax) | Systems Partnermartin@mwtech.UUCP (Martin Weitzel) (01/31/91)
In article <553@twg.bc.ca> bill@twg.bc.ca (Bill Irwin) writes: >I asked for a way to convert the name of a uucp lock file into >its upper case counterpart /dev device name. Since you don't >know which modem ports might be in use, those solutions that had >a particular letter "wired" in have limited value. > >I received several mailed responses. The simplest and most >easily understandable (by me), provided by Stuart Hood, follows: > >case $modem in > i[1-9][a-z]) > real_modem=i`echo $modem | sed 's/i//' | tr '[a-z]' '[A-Z]'` > ;; >esac Hmmm, judging from the numerous followups the original questions seems to draw a lot of answers. As someone else allready metioned the y-command of sed to simplify the above, I'll turn back from this and related ways to solve the problem to another "no sub-processes" solution. Like the original way with "case-in" the following has the limitation that you must set up all the expected names in advance, but this time as shell variables, not as case labels: i0p=i1P i1p=i1P i2p=12P ....etc... Then use eval 'real_modem='$modem . Note that setting up the required variables can be also done in a loop: for i in 0 1 2 3 4 5 6 ...... do eval 'i'$i'p=i'$1'P done Another idea would be to avoid the variables and do it all in a loop: for i in 0 1 2 3 4 5 6 ...... do case $modem in i${i}p) real_modem=i${i}P esac done -- Martin Weitzel, email: martin@mwtech.UUCP, voice: 49-(0)6151-6 56 83
martin@mwtech.UUCP (Martin Weitzel) (01/31/91)
In article <1075@mwtech.UUCP> martin@mwtech.UUCP I wrote: > > i0p=i1P > i1p=i1P > i2p=12P > ....etc... > >Then use eval 'real_modem='$modem . OOPS! Should be ..........=$'$modem of course. -- Martin Weitzel, email: martin@mwtech.UUCP, voice: 49-(0)6151-6 56 83