Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 按日期对svnadmin lslocks排序--获取最新的锁_Bash_Sorting_Svn_Hook - Fatal编程技术网

Bash 按日期对svnadmin lslocks排序--获取最新的锁

Bash 按日期对svnadmin lslocks排序--获取最新的锁,bash,sorting,svn,hook,Bash,Sorting,Svn,Hook,我正在写一个钩子脚本,一旦有人锁定了一个文件,它就会向每个人发送一封电子邮件 因此,我需要锁定文件的用户、文件路径以及锁定文件的日期和时间 有没有办法按照创建日期对svnadmin lslocks的输出进行排序?似乎svnadmin lslocks会对给定存储库中的所有锁进行随机排序 [编辑] svnadmin lslocks/path/to/repository/的一些示例输出: Pfad: /path/to/test/myfile.txt UUID-Marke: opaquelocktoke

我正在写一个钩子脚本,一旦有人锁定了一个文件,它就会向每个人发送一封电子邮件

因此,我需要锁定文件的用户、文件路径以及锁定文件的日期和时间

有没有办法按照创建日期对
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行长。每个块后面都有一个空行。

将$/设置为空字符串将使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(如果日期总是第四行
sort-k4

编辑:只记住最高日期

perl -ne '
    BEGIN {
        $/ = "";
    }
    /^Erstellt:\K.*$/m or next;
    my $record_date = $&;
    $record_date gt $highest or next;
    $highest = $record_date;
    $record = $_;
    END {
        print $record
    }'
尝试以下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”的输出,并构建每个块的数组(arry),每次遇到带有“Pfad”的行时,计数器(cnt)都会递增。同时,我们创建另一个数组(arry1),其中包含提取的日期以及以“-”分隔的计数。日期使用函数mktime获取历元的秒数,在正确显示日期和时间(删除:和-)之后,我们按日期对arry1进行排序,最后一个元素将保存可用于打印arry最后一个块的cnt。

不是脚本中使用的工具。你真正想要的是。使用
svnlook lock
时,您不需要处理锁信息,也不需要对其进行排序。

请发布一些示例输出。谢谢,但这不起作用。它打印一个块,但每次我执行这个命令时,它都是不同的块,而不是最新的块。问题是,
svnadmin lslocks
将随机排序这些块。因此,第一个块可能是在块x之前创建的,反之亦然。我已经修改以获得自历元以来的秒数,并使用它来排序日期。仍然不起作用。和以前一样的行为。为了方便您,我将我的问题更新为更具体的示例输出
svnadmin lslocks
。我最初翻译了一些作品,但可能有一个问题。好的,另一个修改已经作出。考虑到语言的变化;@)谢谢,做得很好!据我所知,已完成。svnlook lock的问题是需要指定锁定文件的确切路径。但这正是我需要的信息。我想发送一封电子邮件,告诉每个人哪个文件现在被锁定了,谁锁定了,什么时候锁定了。由于我只将用户和存储库作为post lock钩子脚本中的参数获取,因此获取信息的唯一方法是使用
lslocks
。我不太确定是否会在bash脚本中启动perl脚本。也不太清楚我如何处理这些变量。我对perl一无所知。最后,我需要能够将所有这些信息存储在bash中的一个变量中,然后在tcl脚本中执行所有这些命令。(我需要tcl实现telnet自动化)。sed:我得到以下错误:sort:multi-character tab'$\\x2'perl:it works,it sorts is升序,因此最新的块是最后一个。但是,没有像这样的换行符:
Pfad:/myfile.txt UUID Marke:opaquelocktoken:997da59c-sdfdsf565df-92e46445df79 Eigentümer:user2 Erstellt:2017-07-12 11:12:51+0200(2017年7月12日,密苏里州)Läuft ab:Kommentar(0 Zeilen):Pfad:/path/to/text.cpp UUID Marke:opaquelocktoken:bfb9b246-4a68-r4231-8369-72cff841sees2-Eigentümer:user1-Erstellt:2017-07-12 11:13:31+0200(Mi,2017年7月12日)Läuft ab:Kommentar(0 Zeilen):
您正在使用哪些操作系统,可以检查行结尾“\n”而不是“\r\n”例如,我正在使用Debian 3.16.39-1,另外,我只想打印最后一块。我在最后使用了
pop@A
,但这会打印数组的随机元素。
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] }'