「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. このファイルから可能なノード名で始まる行を検索し、2 番目の一時ファイルに保存します。
  3. また、ノードではなく行からJobIDなどを取得します。
  4. 各一時ファイルの最初、2番目、3番目の...行を自分の履歴ファイルに並べて追加します。
  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

おすすめ記事