2013-03-29 51 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