格雷普并再切一个空格



我在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

在将输入作为输入发送到命令之前,您可以尝试使用sed从输入中删除任何其他空格cut

sed 's/ +/ /g'

此命令会将多个空格的任何序列替换为单个空格

因此,您的命令将如下所示:

status=$(docker service ls|grep $1|sed 's/ +/ /g'|cut -f7 -d' '| grep -w "1/1")

使用awk优雅地处理重复空格:

status=$(docker service ls | awk -v service=$1 '$2 == service { print $4 }' | grep -w "1/1")

您可以通过将该检查添加到awk来消除grep

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 }')

最新更新