如何优化“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。


我看到了 qstat 的一个非常隐藏的函数(-1),它将节点行直接放在作业行后面。这使一切变得更加简单,给出以下版本:

#!/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

相关内容