Hi nirjhar17,
To get the output you said you wanted in the 3rd message in this thread (except for inconsistent spacing in the output you showed in the symmask commands), the following shell and awk script seems to do what you want. This script will work with any POSIX conforming shell (including bash and ksh). The sed command you gave in your script didn't work on OS X, so I built it into the awk script. (I assume that the file /tmp/devices contains:
29ce 0B7
1ec8 0B8
1ed1 0B9
1eda 0BA
1ed0 0BB
3aa1 0BC
from what you said you wanted in the symmask commands. But, one of the symmask commands shows one space in the 1st line and the other symmask command shows two spaces in the 1st line???)
Anyway, with the script:
#!/bin/bash
hostname="testhost" # This variable was used but not defined in the sample.
# Note that following prompts are written to stderr, not stdout; stdout is going
# into awk.
# Gather the user supplied input:
( # Create subshell to feed all printf output from this subshell to awk.
printf 'enter the sid for DMX: ' >&2
read SID
printf "%s\n" "$SID" # Pass SID to awk...
# Determine number of ports to be processed...
printf 'enter the number of ports: ' >&2
read N
for ((i = 1; i <= N; i++))
do # Prompt for and read dirtor, port, and wwn for this port...
printf "enter director $i: " >&2
read DIR
printf "enter port number $i: " >&2
read PORT
printf "enter wwn associted with director $DIR port $PORT: " >&2
read WWN
# pass DIR PORT, & WWN to awk...
printf "%s %s %s\n" "$DIR" "$PORT" "$WWN"
done ) | awk '
# Get sid from start of script above.
NR == 1 {
sid = $0
next
}
# Read output written by above shell for loop into awk arrays...
FNR == NR {
dir[++np] = $1 # director for port NR
port[np] = $2 # port for port NR
wwn[np] = $3 # wwn for port NR
next
}
# Read data from /tmp/devices...
{ devs = nd == 0 ? $0 : devs "," $0
dev[++nd] = $1
}
# Print the commands associated with the accumulated data...
END { for(i = 1; i <= np; i++) {
for (j = 1; j <= nd; j++) {
# Print symdev commands...
printf("%s -sid %s write_disable %s -SA %s -p %s\n",
"/usr/symcli/bin/symdev",
sid, dev[j], dir, port)
}
}
printf("##Device Unmap##\n")
for(i = 1; i <= np; i++) {
for (j = 1; j <= nd; j++) {
# Print unmap commands...
printf("unmap dev %s from dir %s:%s;\n",
dev[j], dir, port)
}
}
print ""
for(i = 1; i <= np; i++)
# Print symmask commands...
printf("%s -sid %s -wwn %s -dir %s -p %s remove devs %s\n",
"symmask", sid, wwn, dir, port, devs)
}' - /tmp/devices > /tmp/"$hostname"
(If you want to run this on a Solaris/SunOS system, use /usr/xpg4/bin/awk
, /usr/xpg6/bin/awk
, or nawk
instead of awk
.)
With the prompts (shown in black) and the responses (shown in blue):
enter the sid for DMX: 4002
enter the number of ports: 2
enter director 1: 4B
enter port number 1: 0
enter wwn associted with director 4B port 0: 2100001b3283a261
enter director 2: 13B
enter port number 2: 0
enter wwn associted with director 13B port 0: 2100001b32832954
the output stored in /tmp/"$hostname" is:
/usr/symcli/bin/symdev -sid 4002 write_disable 29ce -SA 4B -p 0
/usr/symcli/bin/symdev -sid 4002 write_disable 1ec8 -SA 4B -p 0
/usr/symcli/bin/symdev -sid 4002 write_disable 1ed1 -SA 4B -p 0
/usr/symcli/bin/symdev -sid 4002 write_disable 1eda -SA 4B -p 0
/usr/symcli/bin/symdev -sid 4002 write_disable 1ed0 -SA 4B -p 0
/usr/symcli/bin/symdev -sid 4002 write_disable 3aa1 -SA 4B -p 0
/usr/symcli/bin/symdev -sid 4002 write_disable 29ce -SA 13B -p 0
/usr/symcli/bin/symdev -sid 4002 write_disable 1ec8 -SA 13B -p 0
/usr/symcli/bin/symdev -sid 4002 write_disable 1ed1 -SA 13B -p 0
/usr/symcli/bin/symdev -sid 4002 write_disable 1eda -SA 13B -p 0
/usr/symcli/bin/symdev -sid 4002 write_disable 1ed0 -SA 13B -p 0
/usr/symcli/bin/symdev -sid 4002 write_disable 3aa1 -SA 13B -p 0
##Device Unmap##
unmap dev 29ce from dir 4B:0;
unmap dev 1ec8 from dir 4B:0;
unmap dev 1ed1 from dir 4B:0;
unmap dev 1eda from dir 4B:0;
unmap dev 1ed0 from dir 4B:0;
unmap dev 3aa1 from dir 4B:0;
unmap dev 29ce from dir 13B:0;
unmap dev 1ec8 from dir 13B:0;
unmap dev 1ed1 from dir 13B:0;
unmap dev 1eda from dir 13B:0;
unmap dev 1ed0 from dir 13B:0;
unmap dev 3aa1 from dir 13B:0;
symmask -sid 4002 -wwn 2100001b3283a261 -dir 4B -p 0 remove devs 29ce 0B7,1ec8 0B8,1ed1 0B9,1eda 0BA,1ed0 0BB,3aa1 0BC
symmask -sid 4002 -wwn 2100001b32832954 -dir 13B -p 0 remove devs 29ce 0B7,1ec8 0B8,1ed1 0B9,1eda 0BA,1ed0 0BB,3aa1 0BC
The difference between this output and the output you said you wanted is:
27c27
< symmask -sid 4002 -wwn 2100001b3283a261 -dir 4B -p 0 remove devs 29ce 0B7,1ec8 0B8,1ed1 0B9,1eda 0BA,1ed0 0BB,3aa1 0BC
---
> symmask -sid 4002 -wwn 2100001b3283a261 -dir 4B -p 0 remove devs 29ce 0B7,1ec8 0B8,1ed1 0B9,1eda 0BA,1ed0 0BB,3aa1 0BC
In addition to producing the output you said you wanted, since this script has one invocation of awk (instead of six invocations of cat, two invocations of sed, and four invocations of awk), it should also run a little bit faster.