2017-06-23 147 views
0

我想分析docker node ls -f name=manager的輸出。在bash腳本中解析命令輸出

在bash提示符這是它的外觀

ID       HOSTNAME   STATUS    AVAILABILITY 
kdrdpvwlbwai6626u640sotnh * manager    Ready    Active 

我想打印一個錯誤信息,如果如果grep的比賽中沒有找到單詞「就緒」的STATUS不讀即。

我試過了,但命令docker node ls -f name=manager由於空格和參數在腳本中被視爲多個命令出於某種原因。

這樣做的正確方法是什麼?

回答

0

這樣做的常規方法是

#docker command 
if [ $? -ne 0 ] 
then 
    echo "Docker error" 
fi 

編輯

假如你輸出的兩條線,下面會做

count=$(docker node ls -f name=manager | tail -n 1 | grep -c 'Ready[[:blank:]]*[^[:blank:]]*$') 
if [ $count -ne 1 ] 
then 
    echo "Docker Error" 
fi 
+0

這不是我的Q.我不是試圖讀取命令的狀態,我試圖解析命令的輸出 – curiousengineer

+0

@curiousengineer:我知道但我很確定'docker'會給你除READY之外的任何非零退出狀態'。但是,我已經提出了另一個適合您需求的解決方案。 – sjsam

0

默認情況下,擊識別陣列值由空白字符分隔。 它包含一個名爲IFS的變量和分隔符,如果您想更改它,則必須更改此變量。 常規工藝是:將這種變種的舊值,改變它,處理數據,並恢復它:

OFS=$IFS 
# for new line there is special var: $'\n' 
IFS=$'\n' 
#your code here 
IFS=$OFS 

這樣你就可以改變IFS,讀取整個行作爲一個值,比用過程中它替代:https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

另一種選擇是使用awk(該命令將打印主機和狀態):

docker node ls -f name=manager | awk '{print $2, $3}' 

或優化您搜索和獲取的主機狀態爲n加時賽準備:

docker node ls -f name=manager | awk -F' '{if ($3 != "Ready") print $2}' 

如果你只有一臺主機,就可以使用grep來打印,如果它發現與否:

docker node ls -f name=manager | grep -iq "not ready" && echo "Not found" || echo "Found" 

或省略||echo "Found",如果你想打印一個錯誤信息只有

+0

喜tamar,謝謝,我只是想打印「找到」,如果單詞「就緒」存在或打印「找不到」。 – curiousengineer

+0

爲每行或所有輸出? – Tamar

+0

@curiousengineer你的'awk'解決方案可能無法正常工作,因爲如果你看第一行和第二行,當涉及到字段的數量時,就沒有對應關係。在line2中看到流氓'*'? – sjsam