用于生成运行命令的列表的脚本

时间:2014-10-03 15:42:58

标签: ksh aix

对于半模糊的标题感到抱歉,我不确定如何说出来。我想要生成一个列表,不包括没有匹配的主要/次要编号的设备,然后运行

lkdev -l hdiskn -a -c DATAn

其中hdisk和DATA设备具有相应的主要/次要编号。

在/ dev中,我有 -

root@ testbox /dev
#ls -l | grep -E "DATA|hdisk" | grep -v rhd
crw-r--r--    1 root     system       18,  3 Oct 03 10:50 DATA01
crw-r--r--    1 root     system       18,  2 Oct 03 10:50 DATA02
brw-------    1 root     system       18,  1 Apr 12 2013  hdisk0
brw-------    1 root     system       18,  0 Apr 12 2013  hdisk1
brw-------    1 root     system       18,  3 Jan 14 2014  hdisk2
brw-------    1 root     system       18,  2 Jan 14 2014  hdisk3
brw-------    1 root     system       18,  4 Jan 14 2014  hdisk4

基本上,我正在尝试创建hdisk0,1,4全部被排除的东西,而hdisk2-3分别用DATA01和DATA02锁定。

我最初尝试使用sort和/或uniq来隔离/删除字段,但是甚至无法生成所需的列表,甚至开始查看每个字段上运行命令。

(作为一个说明,我有几台服务器上有数百台。如果只是这几个,我会找到一种“更简单”的方式。)

1 个答案:

答案 0 :(得分:0)

(我现在无法测试,所以请纠正语法错误,如果有的话)

你可以在

之下玩sort en uniq
ls -l | grep -E "DATA|hdisk" | sed -e 's/.* \([0-9]*, *[0-9]*\).*/\1/' | sort | 
   uniq -c | grep -v "       1" | cut -c8- | while read majorminor; do
      ls -l | grep " ${majorminor}" | sed 's/.* //'
   done

但是,您应该首先选择正确的行而不计算:

for data in $(find /dev -type c -name "DATA*" | cut -d/ -f3); do
  majorminor="$(ls -l $data | sed -e 's/.* \([0-9]*, *[0-9]*\).*/\1/')"
  echo "$data <==> $(ls -l hdisk* | grep " ${majorminor}" | sed 's/.* //')"
done