使用提供的字符串在多列列表中轻击文本

时间:2017-08-28 15:22:06

标签: bash

我正在编写一个脚本来处理搜索列表的多种用途。长话短说,我正在查询数据库,并有一个基本列表,如:

    sdc         10:0            KQJWBE11
    sdd         10:1            KSDJFBQK
    sde         10:2            13KN13DD
    sdf         10:3            123DJN1O
    sdg         10:4            213JBDKJ
    sdh         10:5            N2QQWMNE
    sdi         10:6            QKEWJDQJ
    sdj         10:7            QKWJEDWE
    sdk         20:0            QEDQWEDQ
    sdl         20:1            1234E13L
    sdm         20:2            KQNE2OUN
    sdn         20:3            QN2NK3JN
    sdo         20:4            23J23EN2
    sdp         20:5            2WBNEKNW
    sdq         20:6            QWEDKJNW
    sdr         20:7            QWEDQEDD

这些存在于变量“$ {TABLE_FORMAT}”中,并且如上所述格式化为表格。

#... other logic above this

 # Query via primary and secondary location. Example: DISK_ARG="10:1"

 elif [[ ${DISK_ARG} =~ ([[:digit:]]:[[:digit:]])+$ ]]; then
          DISK_ARG_PRIMARY=$(echo "${DISK_ARG}" | cut -d: -f1)
          DISK_ARG_SECONDARY=$(echo "${DISK_ARG}" | cut -d: -f2)
          echo -e "${HEADER}"
          echo -e "${TABLE_FORMAT}" | grep -Ei "($DISK_ARG_PRIMARY):($DISK_ARG_SECONDARY)"
       fi


 # Query secondary location. Example: DISK_ARG="5"

 elif [[ ${DISK_ARG} =~ ([[:digit:]])+$ ]]; then
          DISK_ARG_F2="$(echo "${F2}" | grep -Ei "([[:digit:]]):(${DISK_ARG})")"
          DISK_ARG_PRIMARY=$(echo "${DISK_ARG_F2}" | cut -d: -f1)
          DISK_ARG_SECONDARY=$(echo "${DISK_ARG_F2}" | cut -d: -f2)
          echo -e "${TABLE_FORMAT}" | grep -Ei "($DISK_ARG_PRIMARY):($DISK_ARG_SECONDARY)"
       fi

 else :

 fi

不起作用的违规行是第二个elif:

echo -e "${TABLE_FORMAT}" | grep -Ei "($DISK_ARG_PRIMARY):($DISK_ARG_SECONDARY)"

grep: Unmatched ( or \(

此时的当前变量是:

DISK_ARG_PRIMARY="10 20" 
DISK_ARG_SECONDARY="5 5"

我希望将以下内容呈现为输出:

sdh         10:5            N2QQWMNE
sdp         20:5            2WBNEKNW

我不确定这是否可以通过在grep中构建某种类型的数组或以某种方式修改IFS来实现。我希望脚本处理许多输入并查找相关字段的匹配。

1 个答案:

答案 0 :(得分:0)

在你的情况下

DISK_ARG_PRIMARY=$(echo "${DISK_ARG}" | cut -d: -f1)
DISK_ARG_SECONDARY=$(echo "${DISK_ARG}" | cut -d: -f2)

可以替换为

DISK_ARG_PRIMARY=${DISK_ARG%:*}  # remove :* suffix
DISK_ARG_SECONDARY=${DISK_ARG#*:}  # remove *: prefix

避免使用子壳管和切割

还要向grep添加-w选项以避免匹配子字符串,例如5将不匹配51。

DISK_ARG_PRIMARY="10 20" 
DISK_ARG_SECONDARY="5 5"

拥有

grep -Ew '(10|20):(5|5)'

grep -Ew "($(set -- $DISK_ARG_PRIMARY;IFS=\|;echo "$*")):($(set -- $DISK_ARG_SECONDARY;IFS=\|;echo "$*"))"