如何在 linux shell 的 sql 查询中使用“%”字符?

Posted

技术标签:

【中文标题】如何在 linux shell 的 sql 查询中使用“%”字符?【英文标题】:How to use "%" character in sql query on linux shell? 【发布时间】:2020-09-02 00:44:35 【问题描述】:

我正在尝试通过 pssh 向 linux shell 上的 osquery 发送一条 sql select 语句来拉取安装在一组主机上的所有 jdk 包。

这里是查询:

pssh -h myhosts -i 'echo "SELECT name FROM rpm_packages where name like '%jdk%';"| osqueryi --json'

但是“%”的使用给了我下面的错误。

Error: near line 1: near "%": syntax error

我试图逃避 % ,但错误仍然存​​在。任何想法如何克服这个错误?

【问题讨论】:

【参考方案1】:

这个错误不是来自你的 shell,而是来自查询解析器,它实际上不是由 % 字符引起的,而是由紧接在它前面的 ' 引起的。看看你在哪里引用:

'echo "SELECT name FROM rpm_packages where name like '%jdk%';"| osqueryi --json'
^----------------------------------------------------^     ^-------------------^

shell 在解析参数时会使用这些引号。单引号告诉 shell 忽略其中的任何其他特殊字符,并将引号中的内容视为参数的一部分,但 而不是引号本身。

shell 解析完成后,发送到pssh 的实际逐字参数如下所示:

echo "SELECT name FROM rpm_packages where name like %jdk%;"| osqueryi --json

请注意,所有单引号都已被删除。结果是您的查询工具在一个它不期望的地方看到了%(可能是模数)运算符——就在另一个运算符(like)之后,这对解析器来说与name like * jdk 一样有意义.解析器不明白有两个连续的二元运算符意味着什么,所以它抱怨第二个:%

为了在那里得到一个字面量',你需要跳过这个圈:

'\''
^^^^- start quoting again
|||
|\+-- literal '
|
\---- stop quoting

因此,要解决此问题,请将字符串中的所有 ' 实例替换为 '\''

pssh -h myhosts -i 'echo "SELECT name FROM rpm_packages where name like '\''%jdk%'\'';"| osqueryi --json'

【讨论】:

【参考方案2】:

osqueryi 接受命令行上的单个语句。消除回声可以使引用更简单:

osqueryi --json "SELECT * FROM users where username like '%jdk%'"

但是,您将需要引号通过您的 pssh 命令行。

虽然osqueryi 非常适合简短的事情,但如果您要构建频繁的轮询服务,带有预定查询的osqueryd 通常更简单。

【讨论】:

以上是关于如何在 linux shell 的 sql 查询中使用“%”字符?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 shell 脚本中运行 SQL 查询时获得类似 SQLPLUS 的输出

python 如何在Django shell中检查SQL查询

linux shell执行sql

如何用SQL代码将动态查询结果赋值给变量?

如何在shell 中将sql语句执行结果写入日志中

LINUX下shell脚本如何执行 sql脚本 到DB2数据库?