寻找比较ls特定输出的解决方案,只打印不匹配的行(ksh)

时间:2014-01-16 19:51:00

标签: ksh

脚本非常新,如果已经用尽我很抱歉,但我已经搜索过并且没有真正找到解决方案。

我正在使用ksh,需要比较一些数据才能排除它。

root@ aixtest /dev
#ls -l /dev/hdisk*
brw-------    1 root     system       18,  1 Apr 12 2013  /dev/hdisk0
brw-------    1 root     system       18,  0 Apr 12 2013  /dev/hdisk1
brw-------    1 root     system       18,  3 Jan 14 15:52 /dev/hdisk2
brw-------    1 root     system       18,  2 Jan 14 15:52 /dev/hdisk3
brw-------    1 root     system       18,  4 Jan 14 15:52 /dev/hdisk4
root@ aixtest /dev
#ls -l /dev/ORA*
crw-r--r--    1 root     system       18,  3 Jan 14 16:58 /dev/DATA00
crw-r--r--    1 root     system       18,  4 Jan 14 16:58 /dev/DATA01

我要做的是比较hdisk *和DATA *集之间的主要和次要数字,并打印不匹配的数据,特别是hdiskN。所以,以上面的例子为例,我只想找到这个 -

hdisk0
hdisk1
hdisk3

这需要比较和排除已被其他人使用的磁盘。旧方法是使用lspv然后排除活动磁盘,但特别是,即使在使用中它们也不会显示为活动磁盘,因此需要另一种方法。


我最终使用了这个:

ls -ld /dev/DATA* /dev/hdisk* | 
    awk '{print $5, $6, $10}' | sort | 
    awk '{print $3, $1, $2}' | uniq -u -f1 | 
    awk '{print $1}' | sed 's/^\/dev\///g' | sort 

3 个答案:

答案 0 :(得分:0)

A=/dev/hdisk*
B=/dev/ORA*
ls -lL $A $B | while read perm n u g maj min d1 d2 d3 file
do
    echo "$file $maj $min"
done | sort -k2,3 | uniq -u -f 1

答案 1 :(得分:0)

Src1=/dev/hdisk*
Src2=/dev/DATA*

ls -l ${Src1} ${Src2} | sed -n 's|^\([^[:blank:]]*[[:blank:]]\{1,\}\)\{5\}\([0-9]*\)[[:blank:]]\{1,\}\([^[:blank:]]*[[:blank:]]\{1,\}\)\{3\}/dev/|\2 |
H
$ {
  x
  s/$/\
/
: again
  s/\(\n\)\([0-9]*\) [^[:cntrl:]]*\(.*\)\n\2 [^[:cntrl:]]*\n/\1\3\1/
  t again
  s/\(\n\)\{2,\}/\1/g
  s/[0-9]* DA.*$//
  p
  }'

未排序(仅ls排序)

PS:ls / dev / ORA *不提供/ dev / DATA00这样的列表: - )

答案 2 :(得分:0)

根据其他评论,这是awk中使用的解决方案 复合数组索引。

首先,我需要一个模拟函数来模拟你的ls -l命令:

lsdisks() {
    cat <<END
brw-------    1 root     system       18,  1 Apr 12 2013  /dev/hdisk0
brw-------    1 root     system       18,  0 Apr 12 2013  /dev/hdisk1
brw-------    1 root     system       18,  3 Jan 14 15:52 /dev/hdisk2
brw-------    1 root     system       18,  2 Jan 14 15:52 /dev/hdisk3
brw-------    1 root     system       18,  4 Jan 14 15:52 /dev/hdisk4
crw-r--r--    1 root     system       18,  3 Jan 14 16:58 /dev/DATA00
crw-r--r--    1 root     system       18,  4 Jan 14 16:58 /dev/DATA01
END
}

然后使用单个awk脚本的解决方案,包含在函数中:

skip_matching_disks() {
    awk -F '[ /]+' '{ major=$5; minor=$6; devname=$NF; }
    /^b/ { blockname[major,minor]=devname }
    /^c/ { rawname[major,minor]=devname }
    END { 
        for (numbers in blockname) 
            if (!rawname[numbers])
                print blockname[numbers]
    }' | sort
}

pipeline() {
    awk '{print $5, $6, $10}' | sort |
        awk '{print $3, $1, $2}' | uniq -u -f1 | 
        awk '{print $1}' | sed 's/^\/dev\///g' | sort
}

print "single awk solution: "
lsdisks | skip_matching_disks 

print "OP solution:"

lsdisks | pipeline

我已经包含了原始解决方案,以便于比较。