bash +验证输出结果

时间:2014-10-01 10:48:48

标签: linux bash shell awk

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

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

1 个答案:

答案 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