2016-08-23 6 views
-1

Linux用のOracle ASM udev rulesファイルを作成するためのソリューションを探しています。私は2つの入力ファイルを持っています。 file1にはASMディスク要件の情報があり、file2にはディスク情報があります。2つの入力ファイルからudev rulesファイルを作成します

たとえば、file1の2行目は、DATA12が各128Gの3つのディスク(DATA12_01、DATA12_02、DATA12_03)を必要としていることを示しています。 file2は、サイズのディスク情報をすべて持っています。これらの2つの入力ファイルから、以下の出力ファイルを作成する必要があります。ここで

猫file1の

Count - size - name 
3 - 128 GB DATA12 
1 - 128 GB TEMP02 
2 - 4 GB ARCH03 
2 - 1 GB ARCH04 
1 - 3 GB ORAC01 

猫FILE2

UUID          Size 
360060e80166ef70000016ef700006700   128.00 GiB 
360060e80166ef70000016ef700006701   128.00 GiB 
360060e80166ef70000016ef700006702   128.00 GiB 
360060e80166ef70000016ef700006703   128.00 GiB 
360060e80166ef70000016ef700006730    4.00 GiB 
360060e80166ef70000016ef700006731    4.00 GiB 
360060e80166ef70000016ef700006733    1.00 GiB 
360060e80166ef70000016ef700006734    1.00 GiB 
360060e80166ef70000016ef700006735    3.00 GiB 

出力ファイル

ACTION=="add|change", ENV{DM_NAME}=="360060e80166ef70000016ef700006700", SYMLINK+="udevlinks/DATA12_01" 

ACTION=="add|change", ENV{DM_NAME}=="360060e80166ef70000016ef700006701", SYMLINK+="udevlinks/DATA12_02" 

ACTION=="add|change", ENV{DM_NAME}=="360060e80166ef70000016ef700006702", SYMLINK+="udevlinks/DATA12_03" 

ACTION=="add|change", ENV{DM_NAME}=="360060e80166ef70000016ef700006703", SYMLINK+="udevlinks/TEMP02_01" 

ACTION=="add|change", ENV{DM_NAME}=="360060e80166ef70000016ef700006730", SYMLINK+="udevlinks/ARCH03_01" 

ACTION=="add|change", ENV{DM_NAME}=="360060e80166ef70000016ef700006731", SYMLINK+="udevlinks/ARCH03_02" 

ACTION=="add|change", ENV{DM_NAME}=="360060e80166ef70000016ef700006733", SYMLINK+="udevlinks/ARCH04_01" 

ACTION=="add|change", ENV{DM_NAME}=="360060e80166ef70000016ef700006734", SYMLINK+="udevlinks/ARCH04_02" 

ACTION=="add|change", ENV{DM_NAME}=="360060e80166ef70000016ef700006735", SYMLINK+="udevlinks/ORAC01_01" 

答えて

0

はAWKでのものです:

$ cat > test.awk 
BEGIN {FS="([.]| +)"} # field separator do deal with "." in file2 128.00 
FNR==1 {next}   # skip header 
NR==FNR {    # read available disks to pool from file1 
    for(i=1; i<=$1; i++) 
     a[$5"_"0i]=$3 # name and set the disks into pool 
    next} 
{ 
    for(i in a) {  # look for right sized disk 
     if(a[i]==$2) { # when found, print... 
      printf "%s%s%s%s%s", "ACTION==\"add|change\", ENV{DM_NAME}==\"",$1,"\",\"SYMLINK+=\"udevlinks/",i,"\"\n" 
      delete a[i] # ... and remove from pool 
      break 
     } 
    } # if no device was found: 
    old=len; len=length(a); if(old==len) {print "No device found for ",$0} 
} 
$ awk -f test.awk file1 file2 
ACTION=="add|change", ENV{DM_NAME}=="360060e80166ef70000016ef700006700","SYMLINK+="udevlinks/DATA12_01" 
ACTION=="add|change", ENV{DM_NAME}=="360060e80166ef70000016ef700006701","SYMLINK+="udevlinks/DATA12_02" 
... 
No device found for THIS_IS_AN_EXAMPLE_OF_MISSING_DISK   666.00 GiB 

for(i in a)を使用したディスク検索のため、プールからディスクを読み取る順序は保証されません。

+0

Awsome。グレート溶液。また、私は各出力の前に別の行 "#uuid date"を追加しようとしています。私は怒鳴りを試み、その動作しません。その エラーも与えていない。
d "" date +%D " printf"%s%s \ n "、"#\ ""、$ 1 "" \ "d"
printf "%s%s%s%s% ENV {DM_NAME} == \ ""、$ 1、 "\"、\ "SYMLINK + = \" udevlinks/"、i、\" \ n " 出力
#360060e801605a400000105a4000039ba
ACTION == "を追加|変更"、ENV {DM_NAME} == "360060e801605a400000105a4000039ba"、 "SYMLINK + =" udevlinks/DATA07_01 – Pavel

+0

HTMLの改行の問題を有する – Pavel

+0

は、所望の出力の例を教えてください。 –

関連する問題