2017-08-08 102 views
1

我需要提取在提交之間刪除的文件名。我有這樣的命令:從svn日誌中提取已刪除文件的名稱

svn log -r 1:30 -v | grep ' D ' | awk -F ' ' '{print $2}' 

該命令

svn log -r 28:30 -v 

輸出爲:

r28 | admin | 2017-08-08 10:02:03 +0000 (Út, 08 srp 2017) | 1 line 
Changed paths: 
    D /smartsvn-linux-9_2_1.tar.gz 

Remove test file 1 
------------------------------------------------------------------------ 
r29 | admin | 2017-08-08 10:02:21 +0000 (Út, 08 srp 2017) | 1 line 
Changed paths: 
    D /smartsvn-linux-9_2_1 (copy).tar.gz 

Remove test file 2 
------------------------------------------------------------------------ 
r30 | admin | 2017-08-08 10:02:52 +0000 (Út, 08 srp 2017) | 1 line 
Changed paths: 
    D /testfile.txt 

Remove testing file 3 

對於此命令:

svn log -r 28:30 -v | grep ' D ' 

輸出爲:

D /smartsvn-linux-9_2_1.tar.gz 
    D /smartsvn-linux-9_2_1 (copy).tar.gz 
    D /testfile.txt 

,並從輸出我想要得到一個輸出,無需字母d:

/smartsvn-linux-9_2_1.tar.gz 
    /smartsvn-linux-9_2_1 (copy).tar.gz 
    /testfile.txt 

它的工作原理差不多吧,但如果文件名包含空格它不工作。我明白爲什麼會發生,但我不知道,我該如何解決它。或者有更好的方法,我該怎麼做?

編輯:同時我解決了我的問題,但我確定它是垃圾。它的工作原理,但我相信它存在更好的方式。我只使用grep或egrep,但我並不知道grep或egrep是否支持組。

svn log -r 1:30 -v | grep ' D ' | egrep '/([a-zA-Z_.0-9\-\(\) -]+)$' -o 
+0

'svn log -r 1:30 -v'的輸出是什麼,你的期望輸出是什麼? – Inian

+0

你可以顯示'svn log -r 1:30 -v'的一些示例輸出以及你需要的預期輸出嗎?空格是默認分隔符,不需要使用'-F',你可以用'awk'過濾,不需要grep – Sundeep

+0

@Sundeep我編輯了我的問題,我希望現在它更清楚我想做什麼。 –

回答

0

無需grep,您可以使用awk達到什麼grep可以做。 使用/ D/篩選行包含D

您可以使用awk從6打印$0開始的子串(這是你想要的圖案的起點)

$ svn log -r 28:30 -v | awk '/ D/{print substr($0,6)}' 

或者你可以使用sub(/[^/]*/來過濾器non-/出:

$ svn log -r 28:30 -v | awk '/ D/{sub(/[^\/]*/,"",$0);print $0}' 
+0

Thx,它的作品完美。我知道這將是一個更簡單的方法。 –

+0

很高興它可以提供幫助。然後可能接受或投票。 :) – CWLiu

+0

現在我注意到你在第二個命令中有錯誤。你忘了逃避一個字面上的斜線。 $ svn log -r 28:30 -v | awk'/ D/{sub(/ [^ \ /] * /,「」,$ 0); print $ 0}' –