2016-07-31 15 views
0
I0709 13:45:33.848619 3415 upgrade_proto.cpp:1044] Attempting to upgrade input file specified using deprecated 'solver_type' field (enum)': models/model 
I0709 20:02:09.081399 3415 solver.cpp:228] Iteration 101, loss = 2.25779 
I0709 20:02:09.081477 3415 solver.cpp:244]  Train net output #0: loss = 2.25779 (* 1 = 2.25779 loss) 
I0709 20:02:09.081495 3415 sgd_solver.cpp:106] Iteration 101, lr = 0.01 
I0709 20:02:20.067615 3415 solver.cpp:228] Iteration 102, loss = 2.22583 
I0709 20:02:20.067740 3415 solver.cpp:244]  Train net output #0: loss = 2.22583 (* 1 = 2.22583 loss) 

花車從像上述文件的表情,我需要的數字2.25779和2.22583在這種情況下,和轉儲每一個上一個新的文件中的行。定期對grep的

我已經試過類似:

cat file.txt | grep -P 'loss = .*[0-9]\n' > res.csv 

這不符合任何壽,我不知道如何獲得更具體的(只有數字沒有損失=)。

所以一:

cat res.csv 

應顯示輸出:

2.25779 

2.22583 
+0

不符合任何內容?它確實匹配'損失= 2.25779'。 – nicael

+0

我沒有得到任何匹配,我運行命令後res.csv是空的 – Member

+0

只是匹配'loss \ s * = \ s * \ d'並且用它來做。 – sln

回答

0

這將任何的sed在任何操作系統上運行:

$ sed -n 's/.*loss = \([0-9.]*\)$/\1/p' file 
2.25779 
2.22583 

只有GNU的grep將支持選項/語法,你要使用,無grep支持你需要實現的目標,即只輸出部分匹配的文本(這需要grep沒有的捕獲組)。

+1

這正是我需要非常感謝的。 – Member

+0

@ A.Danischewski不,它不是。也許你在複製/粘貼時忘記了錨定'$'? –

+0

是的,自從他接受之後,顯然OP已經同意了。輸入中'#'的行不會以'loss = '結尾,如正則表達式所示'/.*loss = \([0-9。] * \)$ /' ,它們以'loss = 2.25779(* 1 = 2.25779 loss)'這樣的文本結尾,因此它們不匹配正則表達式。 –

0

看起來這將幫助你:

(?<!:)[0-9]+(\.[0-9]+) 

它將匹配花車,但將不會匹配微秒,像那樣:

20:02:09.081477

+0

我只需要從這些行2.25779的一個特定的浮動不是時間之一,但謝謝。 – Member

+0

很少有工具會將'\ d'識別爲數字,只有GNU grep纔會支持PCRE,因此您應該說明哪些工具可以使用。 –

+0

@Member這就是我所說的,突出顯示如果你錯過了它。 – nicael

0

需要捕獲基團與()

loss = (\d*\.\d*) 
  • ()是所捕獲的組
  • \d*匹配任意數量的任何長度
  • \.匹配的字符字面上

Here「SA生命演示

+0

很少有工具會將'\ d'識別爲數字,並且不支持捕獲組。指定一個沒有工具(sed,grep,awk,perl,whatever)的regexp可以執行它,因爲它們都支持具有不同選項和分隔符的不同正則表達式。 –