我需要根据以下规则查找资源是否不在线
如果资源名称同时在机器1和机器2上,则其中一个应该联机,否则需要打印资源在上
如果资源名称仅在一台机器1或机器2上,则状态应为联机,否则需要打印资源已关闭
知道如何用bash或awk实现这一点吗?还是perl-one liner?
Resource name machine name status
more file.txt
nis-master machine1 Stop
OnGuard-a machine1 Online
nis-slave machine2 Offline
OnGuard-b machine2 Offline
oracle-vip machine1 Online
oracle-vip machine2 Offline
oracle-disks machine1 Online
oracle-disks machine2 Offline
oracle-res machine1 Stop
oracle-res machine2 Offline
oracle-cluster machine1 Online
oracle-cluster machine2 Offline
示例-资源在两台机器上(无需打印资源已关闭)
Resource: oracle-vip machine1 Online
Resource: oracle-vip machine2 Offline
示例-资源在一台机器上(需要打印资源)
Resource: nis-master machine1 Stop
示例-两台机器上都有资源(需要打印资源)
Resource: oracle-vip machine1 Offline
Resource: oracle-vip machine2 Offline
同时我(在bash中)编写了以下代码,但也许有人可以改进它,以更好地缩短的解决方案
FIRST_LINE=` awk '{print $1}' file.txt | grep -v Resource `
for i in $FIRST_LINE
> do
> [[ ` grep -c $i file.txt ` -eq 1 ]] && [[ ` grep $i file.txt | awk '{print $3}' | grep -c Online ` -eq 0 ]] && echo $i no online
> [[ ` grep -c $i file.txt ` -eq 2 ]] && [[ ` grep $i file.txt | awk '{print $3}' | grep -c Online ` -eq 0 ]] && echo $i no online
> done
nis-master no online
nis-slave no online
OnGuard-b no online
oracle-res no online
oracle-res no online
以下是使用awk:的方法
awk '{seen[$1]} $3 == "Online" {online[$1]}
END {for(i in seen)if(!(i in online)) print i ": resource is down"}' file
将每个文件名添加到seen
数组中。将第三列中带有"Online"的文件名添加到online
数组中。处理完文件后,浏览所有文件的列表,并打印不在online
数组中的文件。
在你的文件上测试:
$ awk '{seen[$1]}$3 == "Online" {online[$1]}END{for(i in seen)if(!(i in online)) print i ": resource is down"}' file
oracle-res: resource is down
OnGuard-b: resource is down
nis-master: resource is down
nis-slave: resource is down