我想解析<div>
的输出。
在bash提示下,这就是它的外观
docker node ls -f name=manager
如果ID HOSTNAME STATUS AVAILABILITY
kdrdpvwlbwai6626u640sotnh * manager Ready Active
不是Read,我想打印一条错误消息,即如果在grep中找不到匹配的单词“Ready”。
我尝试了但是由于空格和参数,命令STATUS
由于某种原因被视为脚本中的多个命令。
这样做的正确方法是什么?
答案 0 :(得分: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
答案 1 :(得分:0)
默认情况下,Bash将数组值识别为由空白字符分隔。
它包含一个名为IFS
的变量,带有分隔符,如果要更改它,则必须更改此变量。
常规过程是:存储此var的旧值,更改它,处理数据并恢复它:
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}'
或者优化搜索并获取状态尚未就绪的主机:
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"