如何多次排序?

时间:2014-01-03 21:50:33

标签: linux perl bash solaris disk

我必须弄清楚OmniOS(Solaris 10)存储阵列中属于每个设备的物理磁盘编号。我可以通过

获取设备列表
cfgadm -al | grep disk-path | cut -c 6-21 | tr 'a-z' 'A-Z'

输出看起来像

5000C5005CF65F14
5000C5004F30CC82
...

所以我的想法是编写一个脚本,我dd每台设备并观察LED,然后输入闪烁的LED编号。由于存储阵列两侧都有LED,我需要能够多次运行脚本,并且每次输入磁盘位置时,我都不必再次输入。

我目前的想法是循环从上面的命令获得的设备名称列表然后做这样的事情

system("dd if=/dev/dsk/c1t${device}d0p0 of=/dev/null bs=1k count=100");
print "which led flashed: ";
my $disk = <STDIN>;
chomp $disk;
system("echo $disk $device >> disk.sorted");

会生成像这样的行

21 5000C5005CF65F14
09 5000C5004F30CC82
...

我在第一种情况下看到过led 21闪光灯,在第二种情况下看到了led 9。共有70个磁盘。

我的问题

我无法想出如何编写可以多次运行的脚本,并且每次运行它都不会破坏我之前输入的值。

任何想法如何做到这一点?

我正在Linux上进行原型设计。

2 个答案:

答案 0 :(得分:0)

对于每次skript运行,请将输出写入另一个文件,例如out.1out.2,依此类推。然后运行

sort -k +2 out.*

您将一个接一个地获得一个磁盘的所有结果。排序将根据第二列(即磁盘ID)对给出的所有文件的内容进行排序。

答案 1 :(得分:0)

脚本1

rm -f /tmp/a/*
rm -f /tmp/b/*
mkdir -p /tmp/a
mkdir -p /tmp/b

for f in $(cfgadm -al | grep disk-path | cut -c 6-21 | tr 'a-z' 'A-Z'); do touch /tmp/a/$f; done

脚本2

controller="c3t"

for f in /tmp/a/*; do
    dd if=/dev/dsk/$controller${f##*/}d0p0 of=/dev/null bs=1k count=100
    echo "Which led flashed? Press RET to skip to next"
    read n
    if ! [ -z $n ]; then echo $controller${f##*/} > /tmp/b/$n && rm -f $f; fi
done

cat /tmp/b/*

脚本3

for f in /tmp/b/*; do
    echo $f
    dd if=/dev/dsk/$(cat $f)d0p0 of=/dev/null bs=1k count=100
done