grep并再切一个空格

时间:2017-04-30 22:01:02

标签: bash shell scripting

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

2 个答案:

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