SVN日志 - 仅在评论中获取带有模式的修订

时间:2014-11-04 18:50:59

标签: bash svn

我正在尝试创建一个简单的bash脚本,用于验证哪些修订版本的注释中不包含某种模式。

例如:

------------------------------------------------------------------------
r272876 | user | 2014-10-30 11:15:06 +0000 (Qui, 30 Out 2014) | 1 line

PATTERN-17278: My comment.
------------------------------------------------------------------------
r272877 | user | 2014-10-31 12:06:41 +0000 (Sex, 31 Out 2014) | 1 line

My problematic revision
------------------------------------------------------------------------
r273529 | user | 2014-10-20 17:45:36 +0000 (Seg, 20 Nov 2014) | 2 lines

PATTERN-17297: Erro no angulo do vetor velocidade
------------------------------------------------------------------------    
r273797 | user | 2014-10-14 11:35:05 +0000 (Ter, 4 Nov 2014) | 1 line

Other problematic revision
------------------------------------------------------------------------
r274096 | user | 2014-08-26 11:18:31 +0000 (Qua, 5 Nov 2014) | 1 line

And another

如何在列表中轻松打印r272877,r273797和r274096等修订版?

1 个答案:

答案 0 :(得分:2)

首先,让我们定义一个shell变量,该变量包含SVN用来分隔日志条目的虚线:

RS='\n------------------------------------------------------------------------'

现在,我们可以打印包含pattern的所有日志条目:

svn log . | awk -v "RS=$RS" '!/pattern/{print RS,$0}'

或者,如果您只想要执行包含pattern的日志条目,请使用:

svn log . | awk -v "RS=$RS" '/pattern/{print RS,$0}'

如何运作

  • -v "RS=$RS"

    awk将其输入划分为记录并一次读入一条记录。在这里,我们将记录分隔符定义为SVN用于分隔日志条目的内容。

  • !/pattern/{print RS,$0}

    awk隐式循环输入中的每个记录。这会查找 not 包含pattern的记录,其中pattern可以是任何正则表达式。感叹号!表示“不是”。打印符合此标准的记录。 print RS,$0告诉awk打印记录分隔符,然后打印此日志条目的内容。

我的subversion版本使用72个破折号作为记录分隔符。我不知道这是否会因版本而异。如果是,您可能需要适当调整RS的定义。

实施例

使用保存在名为log的文件中的示例日志输出,打印所有不包含PATTERN-17278的记录:

$ awk -v "RS=$RS" '!/PATTERN-17278/{print RS,$0}' log

------------------------------------------------------------------------ 
r272877 | user | 2014-10-31 12:06:41 +0000 (Sex, 31 Out 2014) | 1 line

My problematic revision

------------------------------------------------------------------------ 

替代输出:仅返回修订号

修订号是记录分隔符后面的第一个项目。要打印出修订版号,请使用:

svn log . | awk -v "RS=$RS" '!/pattern/{print $1}'

使用示例输入[在更新问题之前]作为示例:

$ awk -v "RS=$RS" '!/PATTERN-17278/{print $1}' log2
r2728

使用变量模式

awk -v "RS=$RS" -v p='PATTERN-17278|PATTERN-17297' '$0 !~ p{print $1}' log3
r272877
r273797
r274096