Bash - 字符串验证方法

时间:2015-05-18 07:15:55

标签: bash unix

我有很多Teradata SQL文件(下面是其中一个文件的示例代码)。

create multiset volatile table abc_mountain_peak as(
select 
a.kkpp_nip as nip,
from BM_RETABLE_BATOK.EDETON a 
) with data on commit preserve rows;

create multiset table qazxsw_asd_1 as (
select
a.address_id,
from  DE30T_BIOLOB.HGG994P_ABS_ADDRESS_TRE a,
) with data on commit preserve rows;

create multiset volatile table xyz_sea_depth as(
select 
a.trip,
from tele_line_tryt a
) with data on commit preserve rows;

CREATE multiset table wsxzaq_zxc_2 AS ( 
SELECT
a.bend_data 
FROM lokl_station a , 
) WITH data on commit preserve rows;

CREATE multiset table rfvbgt_ttuop_3 AS ( 
SELECT
a.heret_bini 
FROM fvgty_blumion a , 
) WITH data on commit preserve rows;

DROP qazxsw_asd_1;
DROP wsxzaq_zxc_2;

.EXIT

我需要做的是创建一个脚本(bash),它可以验证多重表是否被删除。 创建了两种表:

  • multiset易失性表(不应该删除)和
  • multiset表(必须删除)

在我的示例代码中,3个多集表中的2个被删除(这是正确的),其中一个不是(这是不正确的)。 你有任何想法如何创建可以验证类似的东西的脚本(提供信息,一个表,或一些表不被删除)?我真的是bash的初学者。我的想法(可能是错误的)是创建包含多个集表名称的数组(但不是多个集合的易失性表),然后创建另一个表,其中包含' drop'和删除表的名称,最后检查第一个数组中的每个表是否也在第二个数组中。 你怎么看?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我会使用sed分两部分进行:

创建创建列表:

sed -ne 's/^.*create multiset \(volatile \)\?table \(\w\+\).*$/\2/Ip' INPUT FILES | sort > creates.txt

创建删除列表:

sed -ne 's/^.*drop \(\w\+\).*$/\1/Ip' INPUT FILES | sort > drops.txt

创建和删除的表:

join creates.txt drops.txt

已创建但未删除的表:

combine creates.txt not drops.txt

答案 1 :(得分:1)

通过读取文件中的每一行,将与multiset table命令关联的表名隔离成一个数组(dropnames),您可以相当轻松地完成此操作,然后隔离{后面的表名称{1}}语句到另一个数组(DROP)。然后,只需要比较两个数组,找到一个不在另一个数组中的表。像下面这样的简短脚本将为您完成:

droptable

<强>输出

#!/bin/bash

declare -a tmparray                 ## declare array names
declare -a dropnames
declare -a droptable

volstr="multiset volatile table"    ## set query strings
dropstr="multiset table"

## read all lines and collect table names
while read -r line; do

    [[ $line =~ $dropstr ]] && {    ## collect "multiset table" names
        tmparray=( $line )
        dropnames+=( ${tmparray[3]} )
    }

    [[ $line =~ DROP ]] && {        ## collect DROP table names
        tmp="${line/DROP /}"
        droptable+=( ${tmp%;*} )
    }

    unset array

done

## compare droptable to dropnames, print missing table(s)
if [ ${#dropnames[@]} -gt ${#droptable[@]} ]; then

    printf "\n The following tables are missing from DROP tables:\n\n"

    for i in "${dropnames[@]}"; do
        found=0
        for j in "${droptable[@]}"; do
            [ $i = $j ] && found=1 && continue
        done
        [ $found -eq 0 ] && printf "   %s\n" "$i"
    done

elif [ ${#dropnames[@]} -lt ${#droptable[@]} ]; then

    printf "\n The following tables are missing from DROP tables:\n\n"

    for i in "${droptable[@]}"; do
        found=0
        for j in "${dropnames[@]}"; do
            [ $i = $j ] && found=1 && continue
        done
        [ $found -eq 0 ] && printf "   %s\n" "$i"
    done

fi

printf "\n"

exit 0