2017-08-28 3 views
0

私は、リストを検索するために複数の用途を扱うスクリプトを作成しています。長い話を短く、私はこのようなDBを照会し、基本的なリストを持っています:提供された文字列を使用して複数列のリスト内のテキストをグレープ

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 

に置き換えるとも

をカットすることができ、実施例5の意志のためのサブストリングに一致するように避けるためにgrepをする-wオプションを追加します一致しない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 "$*"))"