mysql - 使用 bash 选择 mysql 查询

标签 mysql bash

如何使用 bash select mysql 查询,使每一列都在一个单独的数组值中?

我试过下面的命令,但只有当内容是一个词时它才有效。例如: id= 11, text=hello, important=1

如果我在 text 中有一篇文章。该代码将无法正常工作。我想我可以使用 cut -f -d 但如果“文本”包含特殊字符,它也不会起作用。

while read -ra line; do
    id=$(echo "${line[1]}")
    text=$(echo "${line[2]}")
    important=$(echo "${line[3]}")

    echo "id: $id"
    echo "text: $text"
    echo "important: $important"

done < <(mysql -e "${selectQ}" -u${user} -p${password} ${database} -h ${host})

最佳答案

默认情况下,Bash 在任何空白字符处拆分字符串。首先,您需要为输出设置一个唯一的列标识符,您可以使用 mysql --batch 获取制表符分隔的 csv 输出。

来自 MySQL 手册页:

--batch, -B

Print results using tab as the column separator, with each row on a new line. With this option, mysql does not use the history file. Batch mode results in nontabular output format and escaping of special characters. Escaping may be disabled by using raw mode; see the description for the --raw option

您希望对结果进行转义,所以不要使用--raw,否则结果数据中的制表符会再次中断循环。

要跳过第一行(列名),您可以另外使用选项 --skip-column-names

现在您可以遍历每一行并按制表符将其拆分。 您可以通过临时覆盖 IFS 变量 ( Internal Field Separator ) 强制 bash 按制表符拆分。

示例

# myread prevents collapsing of empty fields
myread() {
    local input
    IFS= read -r input || return $?
    while (( $# > 1 )); do
        IFS= read -r "$1" <<< "${input%%[$IFS]*}"
        input="${input#*[$IFS]}"
        shift
    done
    IFS= read -r "$1" <<< "$input"
 }


# loop though the result rows
while IFS=$'\t' myread id name surname url created; do
     echo "id: ${id}";
     echo "name: ${name}";
     echo "surname: ${surname}"; 
     echo "url: ${url}";
     echo "created: ${created}";
done < <(mysql --batch --skip-column-headers -e "SELECT id, name, surname, url, created FROM users")

myread 函数 所有归功于 this answer通过 Stefan Kriwanek

注意: 您需要非常小心引号和变量定界符。 如果你只是 echo $row[0] 而没有大括号,你会得到错误的结果

编辑 你仍然有一个问题,当一列返回空字符串时,因为内部字段分隔符匹配任意数量的已定义字符:

row1\t\trow3 将创建一个数组 [row1,row3] 而不是 [row1,,row3] 我找到了一个非常好的方法来解决这个问题,更新了上面的例子。 同样read可以直接将输入流分离成变量。

关于mysql - 使用 bash 选择 mysql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21109036/

相关文章:

sql - mysql 查询 : show summary of all payments made and total of invoices by date

python - 处理重音字符 Python/MySQL

linux - 使用 rsync 在脚本上无限循环

bash - 如何在 aprun 中获得排名

java - com.mysql 的数据源实现的名称是什么?

php - 如何从数组键中删除前导零

linux - 如何重定向 Debian 上以 start-stop-daemon 启动的进程的进程输出?

bash - 将 Zsh 历史保存到 ~/.persistent_history

mysql - Lua 脚本停止通过 mysql 代理在 mysql 中触发查询

linux - 来自 tar.gz 的 grep 不提取 [更快的一个]