2017-01-05 6 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 

各ポートは、その物理チェックするために、私は希望state:LinkUpと等しくなければ、エラーを返します。 私は最初の物理的な状態を分離するためにgrepとawqで到着しましたが、各 "ノード"ポートをチェックするためにどのようにforループを作成するのですか?私のようなエラーメッセージを表示したい

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

iはポート番号を分けたい

出力結果のために(forまたはwhileに?):これは私の実際のコードである

「エラーポート2があります」awkとして

+0

'grep'はあなたにそれを伝えない限り、あなたにすべての結果を与えます。コードを表示する。 – pfnuesel

+0

あなたの期待する出力は? – Inian

+0

あなたの答えをありがとう、私は私のメッセージを編集しました – user7379681

答えて

1

更新回答

をリンクアップしませ全くリットルではありません(!)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と表示されない場合は、保存したポート番号と2番目のフィールドが表示されます。


それとも、あなたが、迅速な汚いとシンプルにしたい場合は、あなただけのすべてのポートとすべての物理的な状態をgrepすることができます:

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

サンプル出力

Port 1: 
      Physical state: LinkUp 
    Port 2: 
      Physical state: Polling 
関連する問題