Jak wykonasz grep dla tekstu, który pojawia się w dwóch liniach?
Na przykład:
pbsnodes
to polecenie, którego używam, które zwraca wykorzystanie klastra linuksowego
root$ pbsnodes
node1
state = free
procs = 2
bar = foobar
node2
state = free
procs = 4
bar = foobar
node3
state = busy
procs = 8
bar = foobar
Chcę określić liczbę procesów pasujących do węzłów, które są w stanie „wolne”. Do tej pory byłem w stanie określić „liczbę procesorów” i „węzły w stanie wolnym”, ale chcę je połączyć w jedno polecenie, które pokazuje wszystkie wolne procesy.
W powyższym przykładzie poprawna odpowiedź to 6 (2 + 4).
Co ja mam
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
Jak mogę wyszukać każdą linię, która brzmi „procs = x”, ale tylko wtedy, gdy linia nad nią brzmi „stan = wolny”?
źródło
awk
dopasowuje wzór; nie potrzebujeszgrep
: patrz odpowiedź Stephane'ased
również dopasowuje wzór. Można również użyćperl
, lubphp
, lub cokolwiek język wolisz. Ale przynajmniej nagłówek pytaniaawk
tak używasz ... :)... a oto rozwiązanie Perla:
źródło
Możesz użyć
awk
getline
polecenia:Od
man awk
:źródło