如何在 linux shell 的 sql 查询中使用“%”字符?
How to use "%" character in sql query on linux shell?
我试图通过向 linux shell 上的 osquery 发送 sql select 语句来拉取安装在一组主机上的所有 jdk 包通过 pssh .
这里是查询:
pssh -h myhosts -i 'echo "SELECT name FROM rpm_packages where name like '%jdk%';"| osqueryi --json'
但使用“%”时出现以下错误。
Error: near line 1: near "%": syntax error
我试图转义 % ,但错误仍然存在。有什么想法可以克服这个错误吗?
你不是从你的 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'
osqueryi 接受命令行上的单个语句。消除回声可以使引用更简单:
osqueryi --json "SELECT * FROM users where username like '%jdk%'"
但是,您需要引号才能通过 pssh
命令行。
虽然 osqueryi
非常适合简短的事情,但如果您要构建频繁的轮询服务,osqueryd
计划查询通常更简单。
我试图通过向 linux shell 上的 osquery 发送 sql select 语句来拉取安装在一组主机上的所有 jdk 包通过 pssh .
这里是查询:
pssh -h myhosts -i 'echo "SELECT name FROM rpm_packages where name like '%jdk%';"| osqueryi --json'
但使用“%”时出现以下错误。
Error: near line 1: near "%": syntax error
我试图转义 % ,但错误仍然存在。有什么想法可以克服这个错误吗?
你不是从你的 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'
osqueryi 接受命令行上的单个语句。消除回声可以使引用更简单:
osqueryi --json "SELECT * FROM users where username like '%jdk%'"
但是,您需要引号才能通过 pssh
命令行。
虽然 osqueryi
非常适合简短的事情,但如果您要构建频繁的轮询服务,osqueryd
计划查询通常更简单。