2行に表示されるテキストをどのように検索しますか?
たとえば、
pbsnodes
Linux クラスターの使用率を返すために使用するコマンドです。
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}'
答え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
答え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
可変レコードの組み合わせ(たとえば、nullを使用して行を区切る場合)では、分岐コマンドとをt
使用できますが、b
おそらくawk
より快適な方法で取得できます。