"grep"을 최적화하고 저장하는 방법은 무엇입니까?

"grep"을 최적화하고 저장하는 방법은 무엇입니까?

노드가 충돌하고 검색해야 할 노드를 알 수 있는 파일을 다시 얻지 못하는 경우를 대비하여 내 계산이 실행 중인 클러스터의 노드를 알고 싶습니다.

이와 같은 상황을 위해 나는 관리할 수 없는 특정 상황을 제외하고 작업을 수행하는 작은 스크립트를 작성했습니다.

다음 출력에서 ​​JobID, 대기열, 작업 이름 및 실행 중인 노드(실행 중인 경우)를 구문 분석하고 싶습니다.

my12name@omega:/some/fancy/path> qstat -n -u my12name

omega.cluster: 
                                                                   Req'd  Req'd   Elap
Job ID               Username Queue    Jobname    SessID NDS   TSK Memory Time  S Time
-------------------- -------- -------- ---------- ------ ----- --- ------ ----- - -----
2974949.omega.cluste my12name  short    j-M0044_td  21582     1   8 12288m 500:0 R 120:1
   node54/7+node54/6+node54/5+node54/4+node54/3+node54/2+node54/1+node54/0
2974950.omega.cluste my12name  short    j-M0045_td    --      1   8 12288m 500:0 R 120:2
   octo08/7+octo08/6+octo08/5+octo08/4+octo08/3+octo08/2+octo08/1+octo08/0
2974951.omega.cluste my12name  short    j-M0046_td    --      1   8 12288m 500:0 R 120:3
   il41/7+il41/6+il41/5+il41/4+il41/3+il41/2+il41/1+il41/0
2974951.omega.cluste my12name  short    j-M0046_td    --      1   8 12288m 500:0 R 120:3
   il41/15+il41/14+il41/13+il41/12+il41/11+il41/10+il41/9+il41/8
   +il41/7+il41/6+il41/5+il41/4+il41/3+il41/2+il41/1+il41/0
2976371.omega.cluste my12name  short    j-M0049_fr    --      1   8 12288m 500:0 Q   -- 
    -- 

내 스크립트는 현재 다음과 같습니다

#!/bin/bash                                                                                                                                                                                                                           

qstat -n -u my12name |grep -v "[ ]+" > DeleteMeQuick1
cat DeleteMeQuick1|grep 'node\|octo\|il' |tr "/" " "|awk '{print $1}' > DeleteMeQuick2
cat DeleteMeQuick1|grep 'my12name'|awk '{print $1, $3, $4}' > DeleteMeQuick3
awk 'NR==FNR{a[NR]=$0; next} {print a[FNR], $0}' DeleteMeQuick2 DeleteMeQuick3 >> ~/.qstat_history
cat ~/.qstat_history|awk '!NF ||!seen[$2]++' > DeleteMeQuick4
cat DeleteMeQuick4 > ~/.qstat_history
rm DeleteMeQuick*

쿼리가 필요하며

  1. 더하기 기호로 시작하지 않는 줄을 검색하여 임시 파일에 저장합니다.
  2. 이 파일에서 가능한 노드 이름으로 시작하는 줄을 검색하여 두 번째 임시 파일에 저장합니다.
  3. 또한 노드가 아닌 행에서 JobID 등을 가져옵니다.
  4. 각 임시 파일의 첫 번째, 두 번째, 세 번째... 줄을 내 기록 파일에 나란히 추가합니다.
  5. 기록 파일에서 중복 항목을 제거합니다.
  6. 임시 파일을 삭제합니다.

내 기록 파일의 출력은 다음과 같습니다.

...
octo11 2955937.omega.cluste big16 j-M0044_op
node55 2956189.omega.cluste short j-M0045_op
il11 2963103.omega.cluste oshort n2.sh
....

내 첫 번째 grep 예

일반 출력:

2976388.omega.cluste my12name  big24    n2.sh       28095     1  --   48gb 300:0 R   -- 
   il32/23+il32/22+il32/21+il32/20+il32/19+il32/18+il32/17+il32/16+il32/15
   +il32/14+il32/13+il32/12+il32/11+il32/10+il32/9+il32/8+il32/7+il32/6+il32/5
   +il32/4+il32/3+il32/2+il32/1+il32/0

사용시 ...|grep -v '[ ]+':

2976388.omega.cluste my12name  big24    n2.sh       28095     1  --   48gb 300:0 R   -- 
   il32/23+il32/22+il32/21+il32/20+il32/19+il32/18+il32/17+il32/16+il32/15

이 작업을 수행하는 더 좋고 효율적인 방법은 무엇입니까?

현재 내 스크립트는 아직 시작되지 않은 작업을 무시할 수 없습니다(작업 줄에는 "Q"가 포함되어 있고 노드 줄에는 이중 하이픈만 포함되어 있음).

답변1

고마워요, 캐스. 귀하의 12달러 아이디어가 제가 이 새 버전을 얻는 데 도움이 되었습니다.

나는 그것을 다음과 같이 줄일 수 있었습니다.

#!/bin/bash
qstat -n -u my12name|grep -v '[ ]---\|[ ]+\|Username\|Elap'|paste - -|sed 's/\/.*//g'|grep -v ' Q ' >> ~/.qstat_history
cat ~/.qstat_history|awk '!NF ||!seen[$1]++'|sed '/^\s*$/d' > qstat_history.tmp
mv qstat_history.tmp ~/.qstat_history

시작 라인(사용자 이름, Elap, ---)과 더하기 기호로 시작하는 라인을 제거한 다음 paste - -작업 라인( ) 뒤에 노드 라인을 배치하고 s/\/.*//g슬래시( ) 뒤의 노드 내용을 제거하고 실행 중인 각 숙제를 grep합니다. . 대기 중인( ) 작업을 grep하지 마세요 |grep -v ' Q '. 나머지는 내 .qstat_history 파일에 추가됩니다.

다음은 awk를 사용하여 중복된 줄을 제거하고 이를 임시 파일에 저장한 후 임시 파일을 새 .qstat_history로 이동하는 것입니다.


-1작업 행 바로 뒤에 노드 행을 배치하는 qstat( )의 매우 숨겨진 기능을 보았습니다 . 이렇게 하면 모든 것이 훨씬 간단해지며 다음 버전이 제공됩니다.

#!/bin/bash
qstat -u my12name -n -1|sed 's/\/.*//g'|grep 'R' >> ~/.qstat_history
cat ~/.qstat_history|awk '!NF ||!seen[$1]++' > qstat_history.tmp
mv qstat_history.tmp ~/.qstat_history

관련 정보