Shell-Script

從 gitolite 資訊輸出中查找儲存庫名稱

  • April 19, 2015

如何從 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第一行末尾的 。我一直在嘗試幾種方法,但我似乎無法正確排除它,而不包括或排除其他東西。

做這個OS X 10.10.3

根據您在問題中顯示的輸入,這應該有效:

$ 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:“排除到目前為止匹配的任何內容”。結合,我們可以搜尋以 0 個或多個空格或( )-o開頭的行,然後是一個,然後是 0 個或多個字元,直到另一個空格。所有這些都被丟棄,因為只有最後一個單詞被列印出來。@``^[ @]*``R``\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

引用自:https://unix.stackexchange.com/questions/197237