Shell-Script
從 gitolite 資訊輸出中查找儲存庫名稱
如何從 gitolite
info
命令輸出中提取名稱,以便進一步管道到腳本中?我正在編寫一個遷移腳本,將我的所有儲存庫從 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