2017-08-28 38 views
0

我正在编写一个脚本来处理搜索列表的多个用途。长话短说,我查询数据库,并有一个基本的名单像这样:使用提供的字符串在多列列表中查找文本

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来完成。我希望脚本处理很多输入并查找相关字段的匹配项。

回答

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 

及时更换,以免子shell管道和切割

还添加-w选项grep来避免匹配,例如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 "$*"))" 
相关问题