複数行のgrepを実行する方法

複数行のgrepを実行する方法

2行に表示されるテキストをどのように検索しますか?

たとえば、

pbsnodesLinux クラスターの使用率を返すために使用するコマンドです。

root$ pbsnodes
node1
    state = free
    procs = 2
    bar = foobar

node2
    state = free
    procs = 4
    bar = foobar

node3
    state = busy
    procs = 8
    bar = foobar

「アイドル」状態のノードと一致するプロセス数を確認したいと思います。これまで、「プロセス数」と「アイドルノード」を確認できましたが、すべてのアイドルプロセスを表示する1つのコマンドにまとめたいと思います。

上記の例では、正解は6(2+4)です。

私が所有しているもの

root$ NUMBEROFNODES=`pbsnodes|grep 'state = free'|wc -l`
root$ echo $NUMBEROFNODES
2

root$ NUMBEROFPROCS=`pbsnodes |grep "procs = "|awk  '{ print $3 }' | awk '{ sum+=$1 } END { print sum }'`
root$ echo $NUMBEROFPROCS
14

上記の行に「state = free」と表示されている場合にのみ、すべての行で「procs = x」を検索する方法は?

ベストアンサー1

データが常にその形式の場合は、簡単に作成できます。

awk -vRS= '$4 == "free" {n+=$7}; END {print n}'

RS=方法記録は段落です)。

または:

awk -vRS= '/state *= *free/ && match($0, "procs *=") {
  n += substr($0,RSTART+RLENGTH)}; END {print n}'

おすすめ記事