逐行解析mysql结果并将每一行转换为数组-bash脚本

时间:2018-07-02 09:55:10

标签: mysql arrays bash shell

我正在使用bash脚本,由于某些原因,我只能使用bash而不是php或perl等。

我用这段代码从mysql中得到了一些结果,并将它们保存在名为result的变量中:

result=$(mysql -NB -u "$mysqlUser" -p"$mysqlPass" -D "$mysqlDb" -e "select * from sites" )

这是结果:

1 news.bitcoin.com    NULL 840119 stopped 1509636516 1509636688 0 0 0 0
2 blog.blockchain.com NULL NULL   stopped NULL       0          0 0 0 0

现在我要逐行解析此结果,并将每行转换为一个数组,然后以这种方式访问​​它们,例如:

echo $results[0,0] # 1
echo $results[0,3] # 840119
echo $results[0,6] # 1509636688
echo $results[1,1] # blog.blockchain.com
echo $results[1,3] # NULL
echo $results[1,6] # 0

根据this post,我们可以通过andices声明数组,例如多维。

您能帮我解决这个问题,还是将其他可能的方法告知我来完成此任务?

预先感谢

3 个答案:

答案 0 :(得分:0)

忽略了字段将不匹配的偏执狂,您可以尝试遍历数据并通过蛮力将其分配给并行数组。

    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vee-validate/2.0.9/vee-validate.min.js"></script>
    <script>
        formsubmitval = 1;
        Vue.use(VeeValidate);
        new Vue({
            el: "#app",
            template: '#app',
            data() {
                return {
                    cust_name_first: null,
                    cust_id: null,
                    sales_name_first: null,
                };
            },
            methods: {
                doSubmit() {
                    this.$validator.validateAll().then(function(result){
                        if (!result){
                            //this means a validation failed, so exit without doing anything
                            return;
                        }
                        //here you would put your form submit stuff
                        formsubmitval=0;
                        document.getElementById('webform').submit();
                    });
                }
            }
        });
        if (formsubmitval==1)
        {
            window.onbeforeunload = function(e) {
                e = e || window.event;
                e.preventDefault = true;
                e.cancelBubble = true;
                e.returnValue = 'test';
            }
        }           
    </script>

请使用比a,b,c ...更好的名称,但是假设字段2是fqdn,您可以说

row=0
declare -a A B C D 
mysql -NB -u "$mysqlUser" -p"$mysqlPass" -D "$mysqlDb" -e "select * from sites" |
while read a b c d # ...
do (( row++ ))
   A[$row]="$a"
   B[$row]="$b"
   C[$row]="$c"
   D[$row]="$d"
done

快速从该行中获取该字段。整个桌子都可以立即使用...但是一条格式错误的行将把您射向地面。

答案 1 :(得分:0)

将您的输出转换为csv-选中How to output MySQL query results in CSV format? 一种(不好)的方法是:

csv=`echo "${result}" | tr '\t' ','`

然后做魔术:

declare -A output 
IFS=$'\r\n' GLOBIGNORE='*' command eval  'lines=($(echo "${csv}"))'        
for (( i=0; i<${#lines[@]}; i++ ));
do
  IFS=$',' GLOBIGNORE='*' command eval  'oneline=($(echo "${lines[$i]}"))'
  for (( j=0; j<${#oneline[@]}; j++ ));
  do
    output[$i,$j]=${oneline[$j]}
  done
done

最后

echo "${output[0,0]}" # 1
echo "${output[0,3]}" # 840119
echo "${output[0,6]}" # 1509636688
echo "${output[1,1]}" # blog.blockchain.com
echo "${output[1,3]}" # NULL
echo "${output[1,6]}" # 0

请注意所有双引号和大括号。

感谢https://stackoverflow.com/a/11393884/2235381https://stackoverflow.com/a/22432604/2235381

答案 2 :(得分:0)

最终,我的问题以这种方式解决了:

apache

和结果:

declare -A results
row=0
while read -r line; do
    if [[ -z "${line// }" ]]; then 
        continue
    fi        

    declare -a temp2=($line)


    for (( col=0; col<${#temp2[@]}; col++ ));
    do

       results[$row,$col]=${temp2[$col]}

    done

    results[cols]=$(( ${#temp2[@]}-1 ))

    ((row++))
done <<< "$result"
results[rows]=$row