我需要根据以下规则查找资源是否不在线
如果资源名称在机器machine1和machine2上,那么其中一个应该在线,否则需要打印资源关闭
如果资源名称仅在一台机器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
答案 0 :(得分:2)
以下是使用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