我在bash脚本中有一个方法可以执行类似这样的操作
status=$(docker service ls|grep $1|cut -f7 -d' '| grep -w "1/1")
值$1=abc_mongodb1
或$1=abc_mongodb2
等等。它告诉我字符串1/1
是否存在意味着我的服务已启动。当docker service ls
的输出具有不同的空格数时会发生问题,因为服务名称的长度不同。如何告知管道切割部分中的分隔符使用一个或多个空格。可以使用以下类型的输出
Output of type1
`ID NAME MODE REPLICAS IMAGE
fw2qdrh38oeq abc_mongodb2 replicated 1/1 mongo:3.4
l9mvn0wvqaxy abc_mongodb1 replicated 1/1 mongo:3.4
pfjlpa29yb59 abc_mongodb3 replicated 1/1 mongo:3.4`
我的剪切命令在上面工作正常。它在以下情况下失败
Output of type 2(failure case)
ID NAME MODE REPLICAS IMAGE
45uhn1au50ue abc_deltaservice replicated 1/1 abc-deltaservice:latest
cubbmpw657ib abc_mongodb1 replicated 1/1 mongo:3.4
gil4c53jrvyc abc_mongodb2 replicated 1/1 mongo:3.4
hy9ooec4rapd abc_executionengine replicated 1/1 abc-executionengine:latest
vocsigy76ab0 msc_mongodb3 replicated 1/1 mongo:3.4
ze4jg0f2y0jt abc_kongdb replicated 1/1 postgres:9.4
答案 0 :(得分:1)
您可以尝试使用sed
从输入中删除任何其他空格,然后将其作为输入发送到cut
命令
sed 's/ \+/\ /g'
此命令会将多个空格的任何序列替换为单个空格
所以你的命令看起来像:
status=$(docker service ls|grep $1|sed 's/ \+/\ /g'|cut -f7 -d' '| grep -w "1/1")
答案 1 :(得分:0)
使用awk
优雅地处理重复的空格:
status=$(docker service ls | awk -v service=$1 '$2 == service { print $4 }' | grep -w "1/1")
您可以通过将该检查添加到grep
awk
status=$(docker service ls | awk -v service=$1 '$2 == service && $4 == "1/1" { print $4 }')
或者,为了使它更清晰:
status=$(docker service ls | awk -v service=$1 -v state="1/1" '$2 == service && $4 == state { print $4 }')