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

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

2 行に表示されるテキストに対して grep を実行するにはどうすればよいでしょうか?

例えば:

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

'procs = x' と書かれたすべての行を検索し、その上の行に 'state = free' と書かれている場合にのみ検索するにはどうすればよいですか?

答え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}'

答え2

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

node2
    state = free
    procs = 4
    bar = foobar

node3
    state = busy
    procs = 8
    bar = foobar
$ pbsnodes | grep -A 1 free
    state = free
    procs = 2
--
    state = free
    procs = 4
$ pbsnodes | grep -A 1 free | grep procs | awk '{print $3}'
2
4
$ pbsnodes | grep -A 1 free | grep procs | awk '{print $3}' | paste -sd+ 
2+4
$ pbsnodes | grep -A 1 free | grep procs | awk '{print $3}' | paste -sd+ | bc 
6

https://en.wikipedia.org/wiki/パイプライン_(Unix)

答え3

を使用する方法の 1 つを次に示しますpcregrep

$ pbsnodes | pcregrep -Mo 'state = free\n\s*procs = \K\d+'
2
4

$ pbsnodes | \
    pcregrep -Mo 'state = free\n\s*procs = \K\d+' | \
    awk '{ sum+=$1 }; END { print sum }'
6

答え4

固定長データ(レコード内の行数を指す固定長)がある場合は、次の行をパターン スペースに結合するコマンドを(複数回)sed使用できます。N

sed -n '/^node/{N;N;N;s/\n */;/g;p;}'

次のような出力が得られるはずです:

node1;state = free;procs = 2;bar = foobar
node2;state = free;procs = 4;bar = foobar
node3;state = busy;procs = 8;bar = foobar

t可変レコードの構成 (たとえば、空の区切り線を使用) の場合は、分岐コマンドとを使用できますbが、awkより快適な方法で実行できる可能性があります。

関連情報