2014-01-03 4 views
0

Мне нужно выяснить номер физического диска, который принадлежит каждому устройству в массиве хранения OmniOS (Solaris 10). Я могу получить список устройств,Как сортировать строки несколько раз?

cfgadm -al | grep disk-path | cut -c 6-21 | tr 'a-z' 'A-Z' 

где выход может выглядеть

5000C5005CF65F14 
5000C5004F30CC82 
... 

Так моя идея написать сценарий, где я dd каждое устройство и смотреть светодиоды, а затем введите номер светодиода, который вспыхнул. Поскольку на обеих сторонах массива хранения есть светодиоды, мне нужно иметь возможность запускать сценарий несколько раз, и каждый раз, когда я ввожу место на диске, мне не нужно будет вводить его снова.

Моя текущая идея заключается в том, чтобы перебрать список имен устройств я получаю от выше команды, а затем сделать что-то вроде этого

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 
... 

где я увидели светодиод 21 вспышки в первом случае и видели во главе 9 во втором случае. Есть 70 дисков.

Моя проблема

Я не могу придумать с хорошей идеей, как я могу написать скрипт, который может быть запущен несколько раз, и каждый раз, когда он запускается не разрушит мои предыдущие значения я имею вошел.

Любые идеи, как это сделать?

Я прототипирую его на Linux.

+1

Вы можете уточнить "это не разрушат мои предыдущие значения я ввели"? В Perl-коде, который вы написали, каждый раз, когда он запускается, новые значения будут добавлены в файл disk.sorted, а предыдущие не должны быть уничтожены. – dms

+0

На самом деле также неплохая идея, но я бы переключил использование $ f в качестве имени выходного файла и написал $ n в него. И вам нужно перенаправить выход с помощью >> для добавления в файл. – Harald

ответ

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/* 

Script 3

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

Для каждого запуска вашего skript напишите вывод в другой файл, скажем out.1, out.2 и так далее. После запуска

sort -k +2 out.*

вас будет иметь все результаты для одного диска один за другим. Сортировка будет сортировать содержимое всех файлов, указанных в соответствии со вторым столбцом, который является идентификатором диска.

+0

Имя файла должно быть номером диска для содержимого имени устройства или что вы имеете в виду? Я не понимаю твою идею. –

Смежные вопросы