mysql - Bash - 在 Ubuntu 18 中从 mysql-client 解析中分割字符串的问题

标签 mysql arrays string bash ubuntu

我有一个脚本,可以访问中央数据库服务器(CentOS 7.7 上的 mariadb 10.2)以获取随机数据库条目。

#!/bin/bash

function getrandom()
{
     mysql -h 11.22.33.44 -P 3306 -u usr -p password -D dbExample -e "SELECT ip, host FROM hosts ORDER BY RAND() LIMIT 1;"
}

entry=$(getrandom)

数据库有条目,即:

+----+---------+--------------+
| id | ip      | host         |
+----+---------+--------------+
|  2 | 8.8.8.8 | facebook.com |
|  3 | 1.1.1.1 | google.de    |
+----+---------+--------------+

因此,mysql select 应该得到以下字符串:

ip host 8.8.8.8 facebook.com

ip host 1.1.1.1 google.de

所以下一步我想做的就是用 ' ' 将字符串分割成一个数组,并将 [2] 和 [3] 写入 vars 中以进行进一步处理。

在另一台 Centos 7.7 服务器上,这绝对没有问题:

IFS=' ' read -ra ADDR <<< $entry

甚至

ip="$(cut -d' ' -f3 <<< "$entry")"
host="$(cut -d' ' -f4 <<< "$entry")"

但是,当尝试在 ubuntu 18.04 上执行脚本时,任何拆分解决方案似乎都不起作用。我使用 mysql-client-core-10.1 进行 mysql 调用。经过一些不成功的调试尝试后,我回到了 $entry var 的解析。

在这里,我注意到在回显 $entry 时,返回了完整的字符串:

echo $entry

returns: ip host 1.1.1.1 google.de

当回显“$entry”时,仅返回前两个元素:

echo "$entry"

returns: ip host

我认为,这就是问题的根源,但我不明白,为什么这在 CentOS 下工作。

继续我的脚本,分割没有任何作用。我尝试过:

IFS=' ' read -ra ADDR <<< $entry

在 $ADDR 中保存:“ip 主机”

IFS=' ' read -ra ADDR <<< "$entry"

在 $ADDR 中保存:“ip 主机”

ip="$(cut -d' ' -f3 <<< "$entry")"
host="$(cut -d' ' -f4 <<< "$entry")"

在两个变量中保存:“ip host 8.8.8.8 facebook.com”(是的,这实际上与引号一起工作,尽管这应该使“$(cut -d' ' -f4 <<< ”变成根据我的理解,字符串)

ip="$(cut -d' ' -f3 <<< $entry)"
host="$(cut -d' ' -f4 <<< $entry)"

在两个变量中保存:“ip host 8.8.8.8 facebook.com”

ip=$(cut -d' ' -f3 <<< $entry)
host=$(cut -d' ' -f4 <<< $entry)

在两个变量中保存:“ip host 8.8.8.8 facebook.com”

有人可以帮我解决这个问题吗?

编辑:

来自 getrandom | 的输出od -t x1:

0000000 69 70 09 68 6f 73 74 0a 38 2e 38 2e 38 2e 38 09
0000020 66 61 63 65 62 6f 6f 6b 2e 63 6f 6d 0a
0000035

谢谢你,我想我又回到正轨了:)

i  p  <tab> h  o  s  t <newline> 8  .  8  .  8  .  8 <tab>
f  a  c  e  b  o  o  k  .  c  o  m  <newline>

最佳答案

mysql客户端的返回值中有制表符和换行ascii符号。我用以下方法删除了它们:

entry=$(echo "${entry//$'\t'/','}")
entry=$(echo "${entry/$'\n'/','}")

之后,十六进制转储返回:

0000000 69 70 2c 68 6f 73 74 2c 38 2e 38 2e 38 2e 38 2c
0000020 66 61 63 65 62 6f 6f 6b 2e 63 6f 6d 0a
0000035

从那里开始,它与 CentOS 上的相同:

IFS=',' read -r -a array <<< "$entry"
ip=${array[2]}
host=${array[3]}

Echo 在 $ip 中返回 1.1.1.1,在 $host 中返回 google.de

感谢stephanmg和oguz ismail为我指明了正确的方向! =)

当然有一种更流畅的方法可以用 sed 删除制表符和换行符,但我无法让它工作,所以现在有这个尴尬的解决方案。

关于mysql - Bash - 在 Ubuntu 18 中从 mysql-client 解析中分割字符串的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58748836/

相关文章:

带有限制的mysql左连接子查询在父选择上给出具有空值的字段

javascript - jquery 从数组选择选项 - 重复项

arrays - 无循环的动态矩阵乘法

ruby - 如何从 Ruby 字符串中抓取文本片段?

java - 从用户那里获取一个数字并进行更改并将其转换为字符串

mysql - 创建过程并将变量设置为查询时出错

javascript - 如何对代码进行后续处理以加入两个以上的表?

javascript - 获取数组中超过 4294967295 个对象

c++ - 将参数作为 std::string 或 const std::string& 传递?

PHP将变量放入mysql