2017-01-05 46 views
0

我开始在bash,我想实现一个脚本来检查的命令数据ibstat Ibstat返回此例如:猛砸分离结果

command ibstat 
Ibstat returns this for example: 

# ibstat 
CA 'mlx4_0' 
        CA type: MT25418 
        Number of ports: 2 
        Firmware version: 2.3.0 
        Hardware version: a0 
        Node GUID: 0x0002c9030002fb04 
        System image GUID: 0x0002c9030002fb07 
        Port 1: 
                State: Active 
                Physical state: LinkUp 
                Rate: 20 
                Base lid: 2 
                LMC: 0 
                SM lid: 1 
                Capability mask: 0x02510868 
                Port GUID: 0x0002c9030002fb05 
        Port 2: 
                State: Down 
                Physical state: Polling 
                Rate: 10 
                Base lid: 0 
                LMC: 0 
                SM lid: 0 
                Capability mask: 0x02510868 
                Port GUID: 0x0002c9030002fb06 

我想对于每一个端口,以检查身体状态:等于LinkUp,否则我返回一个错误。 我用grep和awq来隔离第一个物理状态,但是我们如何做一个for循环来检查每个“节点”端口?

这是我的实际代码:(?在或同时)

ibstat | grep "Physical state" | awk '{ print $3 }' 

我想单独端口号

对于输出结果,我想象错误消息: “错误端口2是不衔接”

+0

'grep'会给你所有的结果,除非你不告诉它。显示你的代码。 – pfnuesel

+0

您的预期输出是什么。 – Inian

+0

感谢您的回答,我编辑了我的消息 – user7379681

回答

1

更新回答

由于awk是不使用L (!)onger可以接受的,这里是一个bash版本:

ibstat | while IFS=':' read f1 f2; do 
    # If first field is "Port", remember port in variable $p 
    [[ $f1 =~ .*Port.* ]] && p="$f1" 
    # If first field is "Physical state" 
    if [[ "$f1" =~ "Physical state" ]]; then 
     # Just carry on if second field is "LinkUp" 
     [[ $f2 =~ "LinkUp" ]] && continue 
     echo "ERROR: $p is not LinkUp ($f2)" 
    fi 
done 

很明显,你会放一个剧本,叫CheckLink这样的:

#!/bin/bash 
while IFS=':' read f1 f2; do 
    # If first field is "Port", remember port in variable $p 
    [[ $f1 =~ .*Port.* ]] && p="$f1" 
    # If first field is "Physical state" 
    if [[ "$f1" =~ "Physical state" ]]; then 
     # Just carry on if second field is "LinkUp" 
     [[ $f2 =~ "LinkUp" ]] && continue 
     echo "ERROR: $p is not LinkUp ($f2)" 
    fi 
done 

,并使其可执行文件:

chmod +x CheckLink 

然后运行它

ibstat | ./CheckLink 

样本输出

ERROR:   Port 2 is not LinkUp (Polling) 

原来的答案

如何:

ibstat | awk -F: '$1~/Port [0-9]+/{p=$1} /Physical state:/ && ! /LinkUp/{print p,$2}' 

样本输出

Port 2 Polling 

所以,每次我们看到Port后面加一个空格和一些数字的时候,我们记得在可变p的端口。每当我们在同一行看到Physical state:而不是LinkUp时,我们会打印我们保存的端口号和行中的第二个字段。


或者,如果你想快速,肮脏和简单,你可以只用grep所有端口和所有的物理状态:

ibstat | grep -E "Port \d+:|Physical state:" 

样本输出

Port 1: 
      Physical state: LinkUp 
    Port 2: 
      Physical state: Polling