2017-02-17 52 views
2

我需要從svn日誌的每一行中提取兩個參數,但我無法用grep來完成。Bash Substring多個參數

我SVN的日誌的命令,如

svn log http://svn.apache.org/repos/asf/xerces/java/trunk/ | grep "^r[0-9]\+ | " | cut -c2- 

結果輸出格式爲:

318150 | lehors | 2002-01-28 20:48:11 +0100 (Mon, 28 Jan 2002) | 2 lines 
318149 | elena | 2002-01-28 20:46:33 +0100 (Mon, 28 Jan 2002) | 12 lines 
318148 | lehors | 2002-01-28 20:33:36 +0100 (Mon, 28 Jan 2002) | 2 lines 
318147 | lehors | 2002-01-28 20:22:51 +0100 (Mon, 28 Jan 2002) | 2 lines 

我如何可以grep版本號(第一個參數),並在此格式的日期?

318150 2002-01-28 
318149 2002-01-28 
318148 2002-01-28 
318147 2002-01-28 

回答

2

使用一個更強大的Awk爲此來從單個列進行模式匹配/提取。

.. | awk 'BEGIN{FS="|"}{split($3,temp, " "); print $1,temp[1]}' 
318150 2002-01-28 
318149 2002-01-28 
318148 2002-01-28 
318147 2002-01-28 

.. |部分表示產生所需的輸出,該輸出管內襯到Awk

的邏輯是很直接的,分割輸入線與去限制器|被包括在命令其由FS="|"完成。現在$1代表你想要的第一個字段,對於第二個部分,拆分部分$3並使用split()函數分隔分隔符,一個空格字符並將其存儲在數組temp中,以便它可以作爲temp[1]訪問,其他空間字段出現在數組中,來自病房的下一個索引。

所以最好我想它應該是,

svn log http://svn.apache.org/repos/asf/xerces/java/trunk/ | \ 
    awk 'BEGIN{FS="|"}{split($3,temp, " "); print $1,temp[2]}' 

另外,您可以使用GNU grep-E擴展正則表達式的能力,但它只是不夠好,顯示在同一行的匹配項像,

grep -oE '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}' file 

(和)

grep -oE '^[[:digit:]]{6}' file 

但不在一起,因爲我已使用-o標誌來打印僅匹配部分。

+1

就意識到這將打印時間和OP想要的日期,所以溫度變化[2]溫度[1]將做到這一點:) –

+0

@ZumodeVidrio:更新,謝謝! – Inian

+0

非常感謝。此解決方案完美工作 – Botacco

1

當你的文件是由一個空格分開,你想擁有第一和第五列,這是另一種解決方案通過使用cut

cut -d' ' -f1,5 < svn_log_output_file 

(或管道cut -d' ' -f1,5到您的命令)

+1

此外,您可以進行過程替換,如'cut -d''-f1,5 <(svn log http://svn.apache.org/repos/asf/xerces/java/trunk/) ' – Inian

1

一個更簡單的多delimiters-

awk -F '[| ]' '{print $1, $7}' file 

哪裏file包含在你所表現出的輸出方法問題。

輸出 -

318150 2002-01-28 
318149 2002-01-28 
318148 2002-01-28 
318147 2002-01-28 

當然,你不需要在中間文件來存儲。你可以做 -

svn log http://svn.apache.org/repos/asf/xerces/java/trunk/ \ 
| grep "^r[0-9]\+ | " | cut -c2- | \ 
awk -F '[| ]' '{print $1, $7}' 
0
awk '{print $1,$5}' file 

318150 2002-01-28 
318149 2002-01-28 
318148 2002-01-28 
318147 2002-01-28