我正在编写一个钩子脚本,一旦有人锁定了文件,它就应该向所有人发送电子邮件。
因此,我需要锁定文件的用户,文件的路径以及文件锁定的日期和时间。
有没有办法按照创建的日期对svnadmin lslocks
的输出进行排序?似乎svnadmin lslocks
随机排序给定存储库中的所有锁。
[编辑]
svnadmin lslocks /path/to/repository/
的一些示例输出:
Pfad: /path/to/test/myfile.txt
UUID-Marke: opaquelocktoken:847dfw969-43a15-422fe-9caa5-d
Eigentümer: user3
Erstellt: 2017-07-12 11:18:52 +0200 (Mi, 12. Jul 2017)
Läuft ab:
Kommentar (0 Zeilen):
Pfad: /myfile.txt
UUID-Marke: opaquelocktoken:9397da59c-es1d9-45d1f-92eb-2b627ca6471079
Eigentümer: user3
Erstellt: 2017-07-12 11:12:51 +0200 (Mi, 12. Jul 2017)
Läuft ab:
Kommentar (0 Zeilen):
Pfad: /path/to/text.cpp
UUID-Marke: opaquelocktoken:bfb9bs5246-4a783-42321-83f9-1723c4871cee22
Eigentümer: user2
Erstellt: 2017-07-12 11:13:31 +0200 (Mi, 12. Jul 2017)
Läuft ab:
Kommentar (0 Zeilen):
Pfad: /path/to/my.java
UUID-Marke: opaselocksken:2b13s07-f06b-4s043b-aae12-6db205ee379f99
Eigentümer: user1
Erstellt: 2017-07-12 13:26:26 +0200 (Mi, 12. Jul 2017)
Läuft ab:
Kommentar (1 Zeile):
Ich locke jetzt!
当我再次执行svnadmin lslocks /path/to/repository/
时,输出如下所示:
Pfad: /path/to/text.cpp
UUID-Marke: opaquelocktoken:bfb9bs5246-4a783-42321-83f9-1723c4871cee22
Eigentümer: user2
Erstellt: 2017-07-12 11:13:31 +0200 (Mi, 12. Jul 2017)
Läuft ab:
Kommentar (0 Zeilen):
Pfad: /path/to/my.java
UUID-Marke: opaselocksken:2b13s07-f06b-4s043b-aae12-6db205ee379f99
Eigentümer: user1
Erstellt: 2017-07-12 13:26:26 +0200 (Mi, 12. Jul 2017)
Läuft ab:
Kommentar (1 Zeile):
Ich locke jetzt!
Pfad: /path/to/test/myfile.txt
UUID-Marke: opaquelocktoken:847dfw969-43a15-422fe-9caa5-d
Eigentümer: user3
Erstellt: 2017-07-12 11:18:52 +0200 (Mi, 12. Jul 2017)
Läuft ab:
Kommentar (0 Zeilen):
Pfad: /myfile.txt
UUID-Marke: opaquelocktoken:9397da59c-es1d9-45d1f-92eb-2b627ca6471079
Eigentümer: user3
Erstellt: 2017-07-12 11:12:51 +0200 (Mi, 12. Jul 2017)
Läuft ab:
Kommentar (0 Zeilen):
至少六行的那些块是随机排序的。但我需要最新的块。该块可以有注释,注释可以是n行长。每个块后,都有一个空行。
答案 0 :(得分:2)
在段落模式下将$ /设置为空字符串变为perl
perl -ne '
BEGIN {$/=""}
push @A, $_;
END {
print for sort{
$a=~/^CREATED.*$/m;
my $a1=$&;
$b=~/^CREATED.*$/m;
my $b1=$&;
$a1 cmp $b1
} @A
}'
要在排序块中反转顺序:$b1 cmp $a1
。
编辑:自问题更新后
svnadmin lslocks /path/to/repository/ | perl -ne '
BEGIN {
# set input record separator to turn on "paragraph" mode
# records are delimited by more than 2 newlines (\n\n+)
$/ = "";
}
# append record to array @A
push @A, $_;
END {
# print records sorted by matched regex
print for sort {
$a =~ /^Erstellt:\K.*$/m;
my $a1=$&;
$b =~ /^Erstellt:\K.*$/m;
my $b1=$&;
$a1 cmp $b1
} @A
}'
使用bash将输出存储到变量,例如
content=$( svnadmin ... | perl ... )
echo "$content"
否则要避免使用perl,只能使用GNU sed和sort,(如果date总是第四行sort -k 4
)
svnadmin ... |
sed -rz 's/\n\n+/\x1/g;s/\n/\x2/g;s/\x1/\n/g' |
LC_ALL=C sort -t $'\x2' -k 4 |
sed -rz 's/\n/\n\n/g;s/\x2/\n/g'
编辑:仅记住最高日期
perl -ne '
BEGIN {
$/ = "";
}
/^Erstellt:\K.*$/m or next;
my $record_date = $&;
$record_date gt $highest or next;
$highest = $record_date;
$record = $_;
END {
print $record
}'
答案 1 :(得分:1)
试试这个awk解决方案:
svnadmin lslocks | awk '{ if ( $1 == "Pfad:" ) { cnt++ } arry[cnt]=arry[cnt]$0"\n";if ( $1 == "Erstellt:" ) { arry1[cnt]=mktime(gensub("[-:]"," ","g",$2" "$3))"-"cnt } } END { asort(arry1);split(arry1[cnt],arry2,"-");indx=arry2[2];printf "%s",arry[indx] }'
获取" svnadmin lslocks"的输出并使用计数器(cnt)构建每个块的数组(arry),每次使用" Pfad"遇到了。同时我们创建另一个包含提取日期的数组(arry1)以及由" - "分隔的计数。在正确显示日期和时间之后,日期使用函数mktime来获取纪元的秒数(删除:和 - )最后,我们按日期对arry1进行排序,最后一个元素将保存我们可以用来打印的cnt来自arry的最后一个街区。
答案 2 :(得分:0)
svnadmin lslocks
不是post-lock hook脚本中使用的工具。你真正寻找的是svnlook lock
。当您使用svnlook lock
时,您不需要处理锁定信息,也不需要对其进行排序。