bash脚本

omhiaaxx  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(412)

我使用的是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

根据这篇文章,我们可以通过像多维的andices来声明数组。
你能帮我解决这个问题吗,或者告诉我其他可能的方法来完成这个任务吗?
提前谢谢

cnjp1d6j

cnjp1d6j1#

忽略字段将不匹配的妄想,您可以尝试遍历数据并通过暴力将其分配给并行数组。

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

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

echo ${FQDN[2]}

迅速从那排抢到那块地。整张table马上就可以拿到了…但是一条格式错误的线会击中你的脚。

llycmphe

llycmphe2#

转换您的输出到csv-检查如何以csv格式输出mysql查询结果?一个(不好的)方法是:

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/2235381 以及https://stackoverflow.com/a/22432604/2235381

dbf7pr2w

dbf7pr2w3#

最后我的问题就这样解决了:

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

结果:

echo "${results[rows]}" # 2 => array rows count
echo "${results[cols]}" # 10 => array cols count
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

相关问题