2014-08-31 89 views
-1

我正在嘗試編寫一個bash函數,它只使用grep,awk,sed來打印出bash別名的文檔。如何創建一個bash函數來記錄bash別名

我想使用###作爲相關別名部分的文檔標題。
我想用##作爲一個文檔字符串的別名的描述

一個例子〜/ .bash_aliases文件看起來像這樣

### Docker 

## List running containers 
alias drc="docker ps -a | grep 'Up'" 

## List IDs of running containers 
alias didr="docker ps -aq | grep 'Up'" 

## List IDs of stopped containers 
alias dids="docker ps -aq | grep 'Exited' | awk '{print $1}'" 


### Ansible 

## Run ansible-playbook 
alias ap='ansible-playbook' 

## Run ansible-playbook on local host 
alias apl='ansible-playbook -c local' 


鑑於.bash_aliases文件上面我想創建一個名爲「別名」的bash函數,打印以下輸出

Docker 
------------------------------------------------- 
drc - List running containers 
didr - List IDs of running containers 
dids - List IDs of stopped containers 


Ansible 
------------------------------------------------- 
ap - Run ansible-playbook 
apl - Run ansible-playbook on local host 

我想將「別名」功能放在我的.bash_aliases文件的頂部,以便在輸入.bash_aliases文件時,我可以運行「別名」來查看我的文檔。

我在這個線程的底部看到了一些東西 https://unix.stackexchange.com/questions/128736/how-to-document-my-custom-bash-functions-and-aliases 似乎接近解決方案。我一直在調整它一段時間,並做了大量的谷歌搜索,但我仍然努力獲得我想要的結果。

我將不勝感激任何幫助。謝謝!


UPDATE:

感謝來自埃德莫頓答案和解答這些問題

我能來解決方案。

下面是一個例子〜/ .bash_aliases現在文件

IFS='' read -r -d '' VAR <<'EOF' 
sub(/^###[[:space:]]+/,"") { 
    printf "\n%s%s\n----------------------------------------------------------\n", rs, $0 
    rs = "\n\n" 
} 

sub(/^##[[:space:]]+/,"") { 
    desc = $0 
} 

$1 == "alias" && sub(/=.*/,"",$2) { 
    printf "%-10s - %s\n", $2, desc 
} 
EOF 

function aliases() { 
    echo 
    grep -A10000 "^###" ~/code/bash_aliases/.bash_aliases | awk -f <(echo "$VAR") 
    echo 
} 


### Docker 

## List running containers 
alias drc='docker ps -a | grep 'Up'' 

## List IDs of running containers 
alias didrc='docker ps -aq | grep "Up"' 

## List IDs of stopped containers 
alias dids='docker ps -aq | grep "Exited" | awk "{print $1}"' 


### Ansible 

## Run ansible-playbook 
alias ap='ansible-playbook' 

## Run ansible-playbook on local host 
alias apl='ansible-playbook -c local' 

運行

source ~/.bash_aliases 

後,您可以運行

aliases 

的別名記錄將顯示。

+0

什麼是你的問題,你到目前爲止嘗試過什麼? – tripleee 2014-08-31 19:08:42

+0

好的計劃。問題究竟是什麼? – jm666 2014-08-31 19:15:42

+0

這是我第一次發佈在StackOverflow上。對不起,不清楚。下次我會問一個更具體的問題。 – maoja 2014-09-04 02:50:06

回答

1

sed的是簡單的換人在一行上一個很好的工具,但對於任何其他文字處理,你應該用awk,一旦你使用AWK你不需要額外做任何事情,使用grep或sed的

$ cat tst.awk 
sub(/^###[[:space:]]+/,"") { 
    printf "%s%s\n---------------\n", rs, $0 
    rs = "\n\n" 
} 

sub(/^##[[:space:]]+/,"") { 
    desc = $0 
} 

$1 == "alias" && sub(/=.*/,"",$2) { 
    printf "%s\t- %s\n", $2, desc 
} 

$ awk -f tst.awk file 
Docker 
--------------- 
drc  - List running containers 
didr - List IDs of running containers 
dids - List IDs of stopped containers 


Ansible 
--------------- 
ap  - Run ansible-playbook 
apl  - Run ansible-playbook on local host 

所有的sed語言的構造做跨多行任何在70年代中期就過時了,當AWK在排出。

+1

這正是我想要的打印輸出!我原本希望在我的〜/ .bash_aliases中有一個函數來打印出來,但是我考慮的越多,將awk代碼放在不同的文件中就可以使用相同的文檔註釋(###,# #)在其他文件中。非常感謝! – maoja 2014-09-03 14:25:24

1

With sed。至於你第一步:

sed -nE 's/^### (.*)/\n\1\n-------/p;TA;b;:A;s/^## (.*)/\1/;tX;b;:X;h;n;s/^alias (.*)=.*/\1\t\t- /;G;s/\n//p' ~/.bash_aliases 

輸出:

 

Docker 
------- 
drc    - List running containers 
didr   - List IDs of running containers 
dids   - List IDs of stopped containers 

Ansible 
------- 
ap  - Run ansible-playbook 
apl    - Run ansible-playbook on local host