두 줄에 나타나는 텍스트를 어떻게 검색합니까?
예를 들어:
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
"유휴" 상태에 있는 노드와 일치하는 프로세스 수를 확인하고 싶습니다. 지금까지 "프로세스 수"와 "유휴 노드"를 확인할 수 있었지만 모든 유휴 프로세스를 표시하는 하나의 명령으로 결합하고 싶습니다.
위의 예에서 정답은 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
이를 달성하는 데 사용되는 한 가지 방법은 다음과 같습니다 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
아마도 더 편안한 방법으로 얻을 수 있습니다.