2013-01-15 16 views
2

這是我輸入文件,說modified.txtawk中的代碼來選擇多種模式

------------------------------------------------------------------------ 
r4544 | n479826 | 2012-08-28 07:12:33 -0400 (Tue, 28 Aug 2012) | 1 line 
Changed paths: 
    M /branches/8.6.0/conf/src/main/config/RTSConfig.xml 

CET-402: some text comment 
------------------------------------------------------------------------ 
r4550 | n479826 | 2012-09-04 05:51:29 -0400 (Tue, 04 Sep 2012) | 1 line 
Changed paths: 
    M /branches/8.6.0/conf/src/main/config/RTSConfig.xml 
    M /branches/8.6.0/conf/src/main/config/base.cfg 
    M /branches/8.6.0/conf/src/main/config/prod.cfg 
    M /branches/8.6.0/conf/src/main/config/qa.cfg 
    M /branches/8.6.0/conf/src/main/config/uat.cfg 

CET-438: some text comment 

我的輸出應該是這樣的:

r4544 | n479826 | 2012-08-28 07:12:33 | /branches/8.6.0/conf/src/main/config/RTSConfig.xml 
r4550 | n479826 | 2012-09-04 05:51:29 | /branches/8.6.0/conf/src/main/config/RTSConfig.xml 
r4550 | n479826 | 2012-09-04 05:51:29 | /branches/8.6.0/conf/src/main/config/base.cfg 
r4550 | n479826 | 2012-09-04 05:51:29 | /branches/8.6.0/conf/src/main/config/prod.cfg 
r4550 | n479826 | 2012-09-04 05:51:29 | /branches/8.6.0/conf/src/main/config/qa.cfg 
r4550 | n479826 | 2012-09-04 05:51:29 | /branches/8.6.0/conf/src/main/config/uat.cfg 

輸入文件是一個樣本SVN日誌文件。我想用他們各自的憑據過濾所有修改過的(M)文件。 有人可以幫助一些示例代碼。提前致謝。

回答

3
awk -F"|" '/^r/{a=$1;b=$2;c=substr($3,0,20)}/^ M/{gsub(/ M /," ");print a"|"b"|"c"|"$0}' your_file 

測試:

> awk -F"|" '/^r/{a=$1;b=$2;c=substr($3,0,20)}/^ M/{gsub(/ M /," ");print a"|"b"|"c"|"$0}' temp 
r4544 | n479826 | 2012-08-28 07:12:33| /branches/8.6.0/conf/src/main/config/RTSConfig.xml 
r4550 | n479826 | 2012-09-04 05:51:29| /branches/8.6.0/conf/src/main/config/RTSConfig.xml 
r4550 | n479826 | 2012-09-04 05:51:29| /branches/8.6.0/conf/src/main/config/base.cfg 
r4550 | n479826 | 2012-09-04 05:51:29| /branches/8.6.0/conf/src/main/config/prod.cfg 
r4550 | n479826 | 2012-09-04 05:51:29| /branches/8.6.0/conf/src/main/config/qa.cfg 
r4550 | n479826 | 2012-09-04 05:51:29| /branches/8.6.0/conf/src/main/config/uat.cfg 

解釋:

/^r/{a=$1;b=$2;c=substr($3,0,20)} 

當線以字母R在上面的代碼塊將只執行。 塊裏面說的,第二場第一場從輸入存儲在B和第三個字段是:

2012-08-28 07:12:33 -0400 (Tue, 28 Aug 2012) 

,但我只需要日期與時間戳,其餘的都是過時的我。 它總是20個字符。 所以我從第三個字段取出一個子字符串並將其存儲在c中。

我的主要興趣是以/^M /開頭的行,我必須顯示上一行中以r 開頭的信息,並確保在我們所需的行之前有一行以r開始的行其中有所有的信息我必須預先添加以M開頭的行。

所以每當一行以M開始時,都會預先存儲在ab和c中的值。

M/{gsub(/ M /," ");print a"|"b"|"c"|"$0} 

gsub部分將從當前行刪除「M」部分的空格。 打印部分只是將b和c的值預先添加到當前行的|作爲分隔符。

+0

謝謝sarathi,它的工作原理... – Vivek