在bash脚本中解析命令输出

时间:2017-06-23 07:40:01

标签: bash shell scripting

我想解析<div>的输出。

在bash提示下,这就是它的外观

docker node ls -f name=manager

如果ID HOSTNAME STATUS AVAILABILITY kdrdpvwlbwai6626u640sotnh * manager Ready Active 不是Read,我想打印一条错误消息,即如果在grep中找不到匹配的单词“Ready”。

我尝试了但是由于空格和参数,命令STATUS由于某种原因被视为脚本中的多个命令。

这样做的正确方法是什么?

2 个答案:

答案 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"