여러 줄 grep을 수행하는 방법

여러 줄 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

"유휴" 상태에 있는 노드와 일치하는 프로세스 수를 확인하고 싶습니다. 지금까지 "프로세스 수"와 "유휴 노드"를 확인할 수 있었지만 모든 유휴 프로세스를 표시하는 하나의 명령으로 결합하고 싶습니다.

위의 예에서 정답은 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

https://en.wikipedia.org/wiki/Pipeline_(유닉스)

답변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아마도 더 편안한 방법으로 얻을 수 있습니다.

관련 정보