2014-03-25 76 views
0
的提取只数

某些命令的输出包含从线txt文件

>> ..................546 Jobs Retrieved 
    List of jobs Retrieved: 1-4,6-12,14,2017-2018 ............ 
>>> 30 Jobs Done 
    Jobs terminated: retrieve them with: crab -getoutput <List of jobs> 
    List of jobs: 203,376,578,765,803,809,811 
..................... 

我想只提取203,376,578,765,803,809,811该行后,会出现30个完成工作。之后,我要把这个数字作为一个字符串放入某个变量中,以便在某些命令中使用它。我该怎么做。

我尝试了这种方式:

  1. 我把输出的status.log文件
  2. $ sed的-e '1,/工作完成/ d' status.log | grep的“工作清单:” 后来我只行 的工作清单:578,765,811,836,1068,1096,1128 但我不需要短语“工作清单”

请帮助我。

非常感谢您提前。

+1

cut -d:-f2 yourfile – Jasper

+0

您显示的块是在您的文件中重复显示,还是只显示一次? “作业清单”是否总是恰好在“作业完成”之后出现2行? –

+0

工作列表来了好几次,但Jobs Done只在输出中出现过一次,而且“作业列表”总是恰好在“作业完成”后出现2行。 – ramkrishna

回答

2

您可以使用此:

awk '/30 Jobs Done/ {f=1;next} f && /List of jobs:/ {print $4;exit}' file 
203,376,578,765,803,809,811 

当发现30 Jobs Done它设置标志f为true。
如果再发现List of jobs:和标志f是真实的,印刷领域4

+1

'30 Jobs Done'可能是一种坏模式'\ d + Jobs Done'会好很多。另外,脚本的工作原理也很好。 –

+0

@AaronDigulla @AaronDigulla我不确定,OP在'30 Jobs Done' PS'\ d +'没有在我的'awk'中工作后专门询问数据,所以它会'[0-9] + Jobs Done' – Jotne

+0

@ Jotne谢谢。还有一件事:现在想把这个命令的输出放到一个变量中,所以我正在使用 jobs = $(awk'/ Jobs Done/{f = 1; next} f && /作业列表:/ {print $ 4 ;退出}'status.log) 但它给错误为“非法变量名称。“ – ramkrishna

1

使用简单的工具:

egrep '^\s+List of jobs: [0-9,]+$' status.log | cut -d: -f2 

egrep模式的整条生产线和:cut回报一切相匹配。

这意味着您将在结果中获得领先空间。如果这是一个问题:

egrep '^\s+List of jobs: [0-9,]+$' status.log | cut -d: -f2 | cut -c2- 
1

你可以这样做:

grep -A2 "Jobs Done" yourfile | awk '/List of jobs:/{print $4}' 

抓住两条线以下“完成作业”(-A2),然后找人“的工作清单”与awk并打印4场。

+0

+为简单起见。我不知道为什么人们不喜欢使用管道。是不是这个功能是如此受欢迎! –