【问题标题】:grep and cut with one more spacesgrep 和 cut 多了一个空格
【发布时间】:2017-04-30 22:01:01
【问题描述】:

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

我的 cut 命令在上面运行良好。在以下情况下失败

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

【问题讨论】:

  • 使用awk 而不是cut

标签: bash shell scripting


【解决方案1】:

您可以尝试使用sed 删除输入中的任何其他空格,然后再将其作为输入发送到cut 命令

sed 's/ \+/\ /g'

此命令会将任何一个以上空格的序列替换为一个空格

所以你的命令看起来像:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢,我只是按如下方式使用了 tr,使用 tr 是不是一个坏主意? docker service ls|grep "msc_mongodb1"|tr -s ' '|cut -f4 -d ' '|grep -w "1/1"
    • trsed 可用于修剪空间,但awk 是字段提取和过滤的最佳工具。
    猜你喜欢
    • 2014-12-26
    • 2016-02-04
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    相关资源
    最近更新 更多