使用多个列和空格读取MySQL结果集
假设我有一个MySQL表使用多个列和空格读取MySQL结果集,mysql,bash,Mysql,Bash,假设我有一个MySQL表test,它看起来像: +----+---------------------+ | id | value | +----+---------------------+ | 1 | Hello World | | 2 | Foo Bar | | 3 | Goodbye Cruel World | +----+---------------------+ 1 : Hello 2 : Foo 3 :
test
,它看起来像:
+----+---------------------+
| id | value |
+----+---------------------+
| 1 | Hello World |
| 2 | Foo Bar |
| 3 | Goodbye Cruel World |
+----+---------------------+
1 : Hello
2 : Foo
3 : Goodbye
我执行查询从测试中选择id和value
。
如何使用read
将每列分配给Bash中的变量
read-a
截断值中第一个空格后的所有内容
:
mysql -D "jimmy" -NBe "SELECT id, value FROM test" | while read -a row;
do
id="${row[0]}"
value="${row[1]}"
echo "$id : $value"
done;
输出如下所示:
+----+---------------------+
| id | value |
+----+---------------------+
| 1 | Hello World |
| 2 | Foo Bar |
| 3 | Goodbye Cruel World |
+----+---------------------+
1 : Hello
2 : Foo
3 : Goodbye
但我需要它看起来像:
1 : Hello World
2 : Foo Bar
3 : Goodbye Cruel World
我知道有一些参数可以传递给MySQL以表格式格式化结果,但我需要解析每行中的每个值。这只是我问题的一个简单例子 在中使用单个字段而不是数组:
mysql -D "jimmy" -NBe "SELECT id, value FROM test" | while read -r id value;
do
echo "$id : $value"
done
这将确保id
将被读入id
字段,其他所有内容将被读入value
字段-这就是read
在输入的字段数大于读入的变量数时的行为。如果要读取更多的列,使用与实际数据不冲突的分隔符(如@
)将有助于:
mysql -D "jimmy" -NBe "SELECT CONCAT(id, '@', value, '@', column3) FROM test" | while IFS='@' read -r id value column3;
do
echo "$id : $value : $column3"
done
可以这样做,如果可能的话,还可以避免将命令管道化到while read循环,以避免创建子shell
while read -r line; do
id=$(echo $line | awk '{print $1}')
value=$(echo $line | awk '{print $1=""; print $0}'|sed ':a;N;$!ba;s/\n/ /g'| sed 's/^[ \t]*//g')
echo "ID: $id"
echo "VALUE: $value"
done< <(mysql -D "jimmy" -NBe "SELECT id, value FROM test")
我在使用以结尾的
字段时出现语法错误:您的SQL语法有错误;检查与MySQL服务器版本相对应的手册,以了解在第1行“TERMINATED BY”(终止于)附近使用的正确语法。这仅在使用输出文件时有效吗?使用CONCAT
而不是以
结尾的字段-这应该有效。看起来后者只有在输出重定向到文件时才起作用。在这种情况下使用CONCAT
是否会在value
包含逗号时导致问题?您能解释一下为什么这样做吗?这是因为只有两个变量,并且第一个分隔符之后的所有内容都放在第二个分隔符中吗?还要注意,value在mysql中是一个关键字,所以必须在其周围使用转义字符,例如:从test中选择CONCAT(id,'@',value\'''''''@',column3)