脚本非常新,如果已经用尽我很抱歉,但我已经搜索过并且没有真正找到解决方案。
我正在使用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
答案 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
我已经包含了原始解决方案,以便于比较。