Comment feriez-vous un grep pour du texte qui apparaît sur deux lignes?
Par exemple:
pbsnodes
est une commande que j'utilise qui renvoie l'utilisation d'un cluster Linux
root$ pbsnodes
node1
state = free
procs = 2
bar = foobar
node2
state = free
procs = 4
bar = foobar
node3
state = busy
procs = 8
bar = foobar
Je veux déterminer le nombre de procs qui correspondent aux noeuds qui sont à l'état «libre». Jusqu'à présent, j'ai pu déterminer le "nombre de procs" et "les nœuds à l'état libre", mais je veux les combiner en une seule commande qui montre tous les procs libres.
Dans l'exemple ci-dessus, la bonne réponse serait 6 (2 + 4).
Ce que j'ai
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
Comment puis-je rechercher chaque ligne qui lit «procs = x», mais uniquement si la ligne au-dessus indique «state = free»?
la source
awk
fait la correspondance des motifs; vous n'avez pas besoingrep
: voir la réponse de Stéphanesed
la correspondance des motifs est-elle également possible. Vous pouvez également utiliserperl
, ouphp
, ou la langue que vous préférez. Mais au moins le titre de la question demandait une grep multi-lignes ... ;-)awk
toute façon ... :)... et voici une solution Perl:
la source
Vous pouvez utiliser la
awk
getline
commande:De
man awk
:la source