2013-03-29 55 views
-1

在UNIX环境中寻找关键字获取变量的值,我有一个包含以下细节的file.txt的:在UNIX环境

Data recording started: 
0001100 Matched at 412090 
0001101 Mismatched at 414798 
0001102 Matched at 420007 
0001103 Mismatched at 420015 
Job completed 

我如何能得到通过搜索“匹配”的第一个匹配的值(线2)字,也为第一个“不匹配”(第3行) 找到它们之间的差异并存储为变量,“dif” 结果是匹配减去不匹配,因此它无法通过指定行号找到数据,即找到第3行的最后一个整数减去第2行的最后整数,因为不匹配可能首先出现,如下所示:

Data recording started: 
0001100 Mismatched at 412090 
0001101 Matched at 414798 
0001102 Mismatched at 420007 
0001103 Matched at 420015 
Job completed 
+0

你想在bash(而不是python或awk或ruby或perl)中专门做这个吗?如果是这样,你应该在问题标题或正文文本中提到,而不仅仅是在问题标签中。 –

回答

0

方式一:

echo $(( 
     $(grep Matched input | head -1 | sed 's/.*at //') 
    - $(grep Mismatched input | head -1 | sed 's/.*at //') 
)) 

或只使用sed的:

echo $(( 
     $(sed -n 's/.*Matched.*at //p' input | head -1) 
    - $(sed -n 's/.*Mismatched.*at //p' input | head -1) 
)) 

输出

-2708 
+0

我可以知道's /.* at //'的功能是什么? 以及如何grep这个词,因为我看到命令没有指定'file.txt'? – yamcake01096

+0

'input'是输入文件的名称。 's /.* at //'turn'0001100匹配412090'到'412090' – perreal

+0

如果在数字后面有一些单词会怎么样? '0001100匹配412090行0' 我还可以在//使用s /.*吗? – yamcake01096

0

我们可以使用grep -m 1踢远头。

dif=$(( 
     $(grep -m 1 'Matched' a.txt | sed 's/.*at \([0-9]*\).*/\1/') 
    - $(grep -m 1 'Mismatched' a.txt | sed 's/.*at \([0-9]*\).*/\1/') 
)) 
echo $dif