簡體   English   中英

從文本文件中選擇特定文本,BASH腳本

[英]Selecting specific text from text file, BASH scripting

我一直在集群上運行模擬,我想通過遍歷所有集群節點並復制我需要的所有文件來檢查臨時結果。

我一直想做的是在鍵入qstat -rn u djsavic之后從文本文件中提取作業ID和節點名稱作為字符串從一個文本文件中qstat -rn u djsavic

fermi: 
                                                                               Req'd    Req'd      Elap
Job ID               Username    Queue    Jobname          SessID NDS   TSK    Memory   Time   S   Time
-------------------- ----------- -------- ---------------- ------ ----- ------ ------ -------- - --------
59281.fermi          djsavic     xlarge   Smith2            30676     1      2    --  96:00:00 R 24:19:14
    fermi-node08/1+fermi-node08/0
59282.fermi          djsavic     xlarge   Smith2            30686     1      2    --  96:00:00 R 24:18:56
    fermi-node08/3+fermi-node08/2
59283.fermi          djsavic     xlarge   Smith2            30700     1      2    --  96:00:00 R 24:18:56
    fermi-node08/5+fermi-node08/4
59284.fermi          djsavic     xlarge   Smith2            30729     1      2    --  96:00:00 R 24:21:09
    fermi-node08/7+fermi-node08/6
59285.fermi          djsavic     xlarge   Smith2             9076     1      2    --  96:00:00 R 24:19:24
    fermi-node07/1+fermi-node07/0
59286.fermi          djsavic     xlarge   Smith2             9078     1      2    --  96:00:00 R 24:19:23
    fermi-node07/3+fermi-node07/2
59287.fermi          djsavic     xlarge   Smith2             9079     1      2    --  96:00:00 R 24:19:41
    fermi-node07/5+fermi-node07/4
59288.fermi          djsavic     xlarge   Smith2             9080     1      2    --  96:00:00 R 24:19:57
    fermi-node07/7+fermi-node07/6

實際上,該列表更長,大約80行。

我需要的是作業ID和節點名稱,因此我可以將文件從目錄fermi-node08/59281/復制到某個/location

經過大量的挖掘和搜索,到目前為止,我做了這樣的事情:

for i in `qstat -rn -u djsavic`; do
    for j in `echo $i|grep fermi`; do
             echo $j|sed -r 's/(.{12}).*/\1/'|sed  's/.fermi//';
    done;
done

我得到的是這樣的清單:

fermi:
59281
fermi-node08
59282
fermi-node08
59283
fermi-node08
59284
fermi-node08
59285
fermi-node07
59286
fermi-node07
59287
fermi-node07
59288
fermi-node07

此時,我想將文件從所有/fermi-node##/JobID/復制到所需的位置,並還要從列表的頂部刪除此fermi: 我是bash腳本的新手,如果有人可以在最后一步幫助我,我將不勝感激。

提前致謝。

awk解救!

如果您輸入的是這種形式(記錄在兩行中)和三行標題,則可以使用此方法提取所需的信息

$ awk 'NR>3{ if(!(NR%2)) {sub(".fermi","",$1); n=$1}
              else {sub("/.*","",$1); print $1"/"n}}' file

fermi-node08/59281
fermi-node08/59282
fermi-node08/59283
fermi-node08/59284
fermi-node07/59285
fermi-node07/59286
fermi-node07/59287
fermi-node07/59288

您可以在while循環中使用它進行進一步處理,例如

$ while read f; do echo $f; done < <(awk ...)

只需將echo $f替換echo $f您想要的操作即可。

更新:如果標題行不固定,則可能更健壯

$ awk '/^[0-9]*\.fermi/ {sub(".fermi","",$1); n=$1; next}
                       n{sub("/.*","",$1); print $1"/"n;n=""}' file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM