Disk report generation problem

Hello everyone,

I have a list of inputs as below. My logic is to get the particular powerdisk which matches for ASM disk which means take the major & minor number of each asm disk and matches with powerdisk info then get the particular powerdisk

 
$ ls -l /dev/asm_* ---> ASM disk info
crw-r--r-- 1 oracle dba 34, 3 Jun 21 20:06 /dev/asm_disk1
crw-r--r-- 1 oracle dba 34, 4 Jun 21 20:06 /dev/asm_disk2
crw-r--r-- 1 oracle dba 34, 5 Jun 21 20:06 /dev/asm_disk3
crw-r--r-- 1 oracle dba 34, 11 Jun 21 20:05 /dev/asm_spfile
 
$ ls -l /dev/hdiskpower* --> Powerdisk info
brw-rw---- 1 root system 34, 3 Apr 7 2011 /dev/hdiskpower3
brw-rw---- 1 root system 34, 4 Apr 7 2011 /dev/hdiskpower4
brw-rw---- 1 root system 34, 5 Apr 7 2011 /dev/hdiskpower5
brw-rw---- 1 root system 34, 6 May 16 2011 /dev/hdiskpower6
brw-rw---- 1 root system 34, 7 May 16 2011 /dev/hdiskpower7
brw-rw---- 1 root system 34, 8 May 16 2011 /dev/hdiskpower8
brw-rw---- 1 root system 34, 9 May 16 2011 /dev/hdiskpower9

Below is the code i am using

Code:

 
ls -l /dev/asm_* > /tmp/input$$
cat /tmp/input$$ | while read line
do
mj=`echo $line | awk '{print $5}'`
mi=`echo $line | awk '{print $6}'`
asm_disk=`echo $line | awk '{print $10}'`
ls -l /dev/hdiskpower* | grep '"'$mj $mi'"' | awk '{print $10}' > /tmp/powerdiskinfo.rpt
done

=============
above code is not working while matching with major and minor number with the hdiskpower disks. Please advice how i can achive it . I need the output as below

 
ex:
==
asm_disk1     hdiskpower1
asm_disk2     hdiskpower3
asm_disk3     hdiskpower5

Kindly provide your suggetions and ideas. Thanks !

Regards
Kannan

Where is the "comma" in there?

ls -l /dev/hdiskpower* | grep '"'$mj $mi'"' | awk '{print $10}' > /tmp/powerdiskinfo.rpt

Try this instead, lets see, paste this instead of the line above and post your results

ls -l /dev/hdiskpower* | grep "$mj, $mi" | awk '{print $10}' > /tmp/powerdiskinfo.rpt

Try this...

ls -l /dev/asm_* > asm.txt
ls -l /dev/hdiskpower* > power.txt

awk 'NR==FNR{match($NF,".*/(.*)$",a);x[$5$6]=a[1];next} x[$5$6]{match($NF,".*/(.*)$",a);print x[$5$6],a[1]} ' asm.txt power.txt

--ahamed

dude2cool,
Thanks for the reply

"comma" is already there in the variable $mj. Below is the debug output. Problem is grepping the major & minor number from the hdiskpower lists

 
+ ls -l /dev/asm_disk1 /dev/asm_disk2 /dev/asm_disk3 /dev/asm_spfile
+ 1> /tmp/input10158174
+ cat /tmp/input10158174
+ read line
+ + echo crw-r--r-- 1 oracle dba 34, 3 Jun 21 20:06 /dev/asm_disk1
+ awk {print $5}
mj=34,
+ + awk {print $6}
+ echo crw-r--r-- 1 oracle dba 34, 3 Jun 21 20:06 /dev/asm_disk1
mi=3
+ + awk {print $10}
+ echo crw-r--r-- 1 oracle dba 34, 3 Jun 21 20:06 /dev/asm_disk1
asm_disk=/dev/asm_disk1
+ ls -l /dev/hdiskpower0 /dev/hdiskpower1 /dev/hdiskpower10 /dev/hdiskpower11 /dev/hdiskpower2 /dev/hdiskpower3 /dev/hdiskpower4 /dev/hdiskpower5 /dev/hdiskpower6 /dev/hdiskpower7 /dev/hdiskpower8 /dev/hdiskpower9
+ grep 34, 3
+ awk {print $10}
+ 1> /tmp/powerdiskinfo.rpt

Below is the error i am getting while grepping the major & minor number

 
 
$ ls -l /dev/hdiskpower* |  grep 34, 11
grep: can't open 11
 

need to grep like below.

 
ls -l /dev/hdiskpower* |  grep '34, 11'
 
brw-rw----    1 root     system       34, 11 May 16 2011  /dev/hdiskpower11

Please let me know how i can get it. Thanks again !

Regards
Kamal

---------- Post updated at 11:06 AM ---------- Previous update was at 11:03 AM ----------

ahamed101,
Thanks for your reply.

Below is the error i am getting

 
awk 'NR==FNR{match($NF,".*/(.*)$",a);x[$5$6]=a[1];next} x[$5$6] {match($NF,".*/(.*)$",a);print x[$5$6],a[1]}' asm.txt power.txt
 syntax error The source line is 1.
 The error context is
                 >>> NR==FNR{match(NF),".*/(.*)$", <<< 
 awk: The statement cannot be correctly parsed.
 The source line is 1.
 syntax error The source line is 1.
 

Regards
Kamal

which is your OS? If solaris, use nawk

--ahamed

Hi Ahamed,

i am using AIX

Regards
Kamal

See if you have gawk installed...
or try this...

while read line
do
  arr=( $(echo $line | awk '{print $5, $6, $10}') )
  val=$(grep "${arr[0]} ${arr[1]}" power.txt | awk '{print $NF}')
  test ! -z $val && echo ${arr[2]} $val
done < asm.txt

--ahamed

Ahamed,
gawk is not installed in my AIX machine, also i have tried your code line by line seems "$val" is not coming up. Pls find the output

 
cat asm.txt | while read line
> do
>       arr=$(echo $line | awk '{print $5, $6, $10}')
>       echo $arr
>       val=$(grep "${arr[0]} ${arr[1]}" power.txt | awk '{print $NF}')
>       echo $val
> done
34, 3 /dev/asm_disk1
34, 4 /dev/asm_disk2
34, 5 /dev/asm_disk3
34, 11 /dev/asm_spfile
 

Regards
Kamal

Paste the output bash -x script
Please execute the code which I have given, not the one modified.

arr is supposed to be an array and that is why it is given as arr=( ... )

Why do you want to do a cat file | while... ?? when you can do while...done < file ?
It qualifies for UUoC!!!

--ahamed

Amamed,
Please find the debug output

 
$ sh -x script.sh
 
+ 0< asm.txt
+ read line
+ + echo crw-r--r-- 1 oracle dba 34, 3 Jun 21 20:06 /dev/asm_disk1
+ awk {print $5, $6, $10}
arr=34, 3 /dev/asm_disk1
+ + grep 34, 3 /dev/asm_disk1  power.txt
+ awk {print $NF}
val=
+ test ! -z
+ read line
+ + echo crw-r--r-- 1 oracle dba 34, 4 Jun 21 20:06 /dev/asm_disk2
+ awk {print $5, $6, $10}
arr=34, 4 /dev/asm_disk2
+ + awk {print $NF}
+ grep 34, 4 /dev/asm_disk2  power.txt
val=
+ test ! -z
+ read line
+ + awk {print $5, $6, $10}
+ echo crw-r--r-- 1 oracle dba 34, 5 Jun 21 20:06 /dev/asm_disk3
arr=34, 5 /dev/asm_disk3
+ + awk {print $NF}
+ grep 34, 5 /dev/asm_disk3  power.txt
val=
+ test ! -z
+ read line
+ + awk {print $5, $6, $10}
+ echo crw-r--r-- 1 oracle dba 34, 11 Jun 21 20:05 /dev/asm_spfile
arr=34, 11 /dev/asm_spfile
+ + awk {print $NF}
+ grep 34, 11 /dev/asm_spfile  power.txt
val=
+ test ! -z
+ read line

Regards
Kamal

It is working for me... may be there is some issue with () in AIX
Try this...

while read line
do
  val1=$(echo $line | awk '{print $5}')
  val2=$(echo $line | awk '{print $6}')
  val3=$(echo $line | awk '{print $10}')
  val4=$(grep "$val1 $val2" power.txt | awk '{print $NF}')
  test ! -z $val4 && echo "$val3 $val4"
done < asm.txt

--ahamed

---------- Post updated at 08:49 PM ---------- Previous update was at 08:47 PM ----------

Try this also...

awk 'NR==FNR{x[$5$6]=$NF;next} x[$5$6]{print x[$5$6],$NF} ' asm.txt power.txt 

--ahamed

---------- Post updated at 08:51 PM ---------- Previous update was at 08:49 PM ----------

while read line
do
  val1=$(echo $line | awk '{print $5,$6}')
  val2=$(echo $line | awk '{print $10}')
  val3=$(grep "$val1" power.txt | awk '{print $NF}')
  test ! -z $val3 && echo $val3 $val2
done < asm.txt

--ahamed

ahamed,

Below command is perfectly working !! Thanks a lot :slight_smile:

 
    awk 'NR==FNR{x[$5$6]=$NF;next} x[$5$6]{print x[$5$6],$NF}' asm.txt power.txt

somehow the rest of the codes are not working properly only the final line is grepped

+ 0< asm.txt
+ read line
+ + echo crw-r--r-- 1 oracle dba 34, 3 Jun 21 20:06 /dev/asm_disk1
+ awk {print $5}
val1=34,
+ + echo crw-r--r-- 1 oracle dba 34, 3 Jun 21 20:06 /dev/asm_disk1
+ awk {print $6}
val2=3
+ + echo crw-r--r-- 1 oracle dba 34, 3 Jun 21 20:06 /dev/asm_disk1
+ awk {print $10}
val3=/dev/asm_disk1
+ + awk {print $NF}
+ grep 34, 3 power.txt
val4=
+ test ! -z
+ read line
+ + awk {print $5}
+ echo crw-r--r-- 1 oracle dba 34, 4 Jun 21 20:06 /dev/asm_disk2
val1=34,
+ + awk {print $6}
+ echo crw-r--r-- 1 oracle dba 34, 4 Jun 21 20:06 /dev/asm_disk2
val2=4
+ + awk {print $10}
+ echo crw-r--r-- 1 oracle dba 34, 4 Jun 21 20:06 /dev/asm_disk2
val3=/dev/asm_disk2
+ + awk {print $NF}
+ grep 34, 4 power.txt
val4=
+ test ! -z
+ read line
+ + awk {print $5}
+ echo crw-r--r-- 1 oracle dba 34, 5 Jun 21 20:06 /dev/asm_disk3
val1=34,
+ + awk {print $6}
+ echo crw-r--r-- 1 oracle dba 34, 5 Jun 21 20:06 /dev/asm_disk3
val2=5
+ + awk {print $10}
+ echo crw-r--r-- 1 oracle dba 34, 5 Jun 21 20:06 /dev/asm_disk3
val3=/dev/asm_disk3
+ + awk {print $NF}
+ grep 34, 5 power.txt
val4=
+ test ! -z
+ read line
+ + echo crw-r--r-- 1 oracle dba 34, 11 Jun 21 20:05 /dev/asm_spfile
+ awk {print $5}
val1=34,
+ + echo crw-r--r-- 1 oracle dba 34, 11 Jun 21 20:05 /dev/asm_spfile
+ awk {print $6}
val2=11
+ + echo crw-r--r-- 1 oracle dba 34, 11 Jun 21 20:05 /dev/asm_spfile
+ awk {print $10}
val3=/dev/asm_spfile
+ + grep 34, 11 power.txt
+ awk {print $NF}
val4=/dev/hdiskpower11
+ test ! -z /dev/hdiskpower11
+ echo /dev/asm_spfile /dev/hdiskpower11
/dev/asm_spfile /dev/hdiskpower11
+ read line

thanks again for your help

Regards
Kamal