从 gitolite 信息输出中查找存储库名称

从 gitolite 信息输出中查找存储库名称

如何从 gitoliteinfo命令输出中提取名称,以便进一步通过管道传输到脚本中?

我正在编写一个迁移脚本,将我的所有存储库从 gitolite 迁移到 Gitlab 服务器。因此,我想从 gitolite 获取所有存储库名称并在 Gitlab 中使用它们。下边是示例输出我正在尝试匹配。

hello sitaram, this is gitolite v2.1-29-g5a125fa running on git 1.7.4.4
the gitolite config gives you the following access:
     R      SecureBrowse
     R   W  anu-wsd
     R   W  entrans
    @R   W  git-notes
    @R   W  gitolite
     R   W  gitolite-admin
     R   W  indic_web_input
 @C  R   W  private/sitaram/[\w.-]+
     R   W  proxy
 @C @R   W  public/sitaram/[\w.-]+
    @R_ @W_ testing
     R   W  vic

这应该输出:

SecureBrowse
anu-wsd
entrans
git-notes
gitolite
gitolite-admin
indic_web_input
proxy
testing
vkc

目前我正在尝试将其放入 shell 脚本中,以便其他人可以使用。我当前的方法是一个grep命令,如下所示:

grep -Eio "([A-Za-z0-9_-]+)$" gitolite-info-output

但是,这也捕获了4第一行末尾的 。我一直在尝试几种方法,但我似乎无法在不包含或排除其他内容的情况下正确排除它。

这样做操作系统 X 10.10.3

答案1

根据您在问题中显示的输入,这应该有效:

$ grep -oP '^[ @]*R.* \K.*' gitolite-info-output
SecureBrowse
anu-wsd
entrans
git-notes
gitolite
gitolite-admin
indic_web_input
proxy
testing
vic

这是使用 GNU grep 的-P开关来启用 Perl 兼容正则表达式,它给我们\K:“排除到目前为止匹配的任何内容”。结合-o,我们可以搜索以 0 个或多个空格或@( ^[ @]*) 开头的行,然后是R,然后是 0 个或多个字符,直到另一个空格。所有这些都被丢弃,因为\K只打印了最后一个单词。


如果您没有 GNU grep(例如,在 OSX 上),您可以执行以下操作:

$ grep -E '^[ @]*R' gitolite-info-output | awk '{print $NF}'
SecureBrowse
anu-wsd
entrans
git-notes
gitolite
gitolite-admin
indic_web_input
proxy
testing
vic

或者完成整个事情awk

$ awk '/^[ @]*R/{print $NF}' gitolite-info-output 
SecureBrowse
anu-wsd
entrans
git-notes
gitolite
gitolite-admin
indic_web_input
proxy
testing
vic

或者 Perl:

$ perl -nle '/^[ @]*R.*\s(.*)/ && print $1' gitolite-info-output 
SecureBrowse
anu-wsd
entrans
git-notes
gitolite
gitolite-admin
indic_web_input
proxy
testing
vic

相关内容