bash+验证输出的结果



我需要根据以下规则查找资源是否不在线

如果资源名称同时在机器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

最新更新