【问题标题】:How to sort lines multiple times?如何多次对行进行排序?
【发布时间】:2014-01-21 16:38:50
【问题描述】:

我必须找出属于 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 上对其进行原型设计。

【问题讨论】:

  • 你能澄清一下“它不会破坏我以前输入的值”吗?在您编写的 perl 代码中,每次运行时,都会将新值附加到“disk.sorted”文件中,并且不应破坏之前的值。
  • 其实也不错,但我会切换到使用 $f 作为输出文件名并将 $n 写入其中。您需要使用 >> 进行输出重定向才能附加到文件中。

标签: linux perl bash solaris disk


【解决方案1】:

对于脚本的每次运行,将输出写入不同的文件,例如 out.1out.2 等等。之后运行

sort -k +2 out.*

您将获得一张又一张磁盘的所有结果。 sort 会根据第二列给出的所有文件的内容进行排序,也就是磁盘id。

【讨论】:

  • 文件名应该是磁盘号内容设备名,还是什么意思?我不明白你的想法。
【解决方案2】:

脚本 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 2012-02-03
    相关资源
    最近更新 更多