我的一个 json 文件 file1.json 中有以下内容:-
{
"$quer": {
"args": [{
"args": [
"select\n db1.table1 as tab1,\n db1.table2 as tab2,\n db1.table3 as tab3\n from db1.table4 as tab4"
],
"fn": "from-sql",
"ns": "op"
}],
"fn": "operators",
"ns": "op"
}
}
我想db1.table4
从这个 json 文件中提取字符串并存储到一个变量中。
我不太了解 sed 和 awk。有人可以帮忙吗?
看看命令行 JSON 处理器,
jq
例如安装:您想要的字符串不是 JSON 值,它是 JSON 值的一部分。所以我建议你
jq
用来获取你需要操作的字符串到一个变量中,例如:这将为您提供一个包含 SELECT 语句的变量:
然后,您将需要使用其他工具(如 sed、awk、cut 等)从该变量中获取您想要的子字符串。对于您的特定情况,这将起作用,但当然可能不适用于不同的 SELECT 语句。按空格分隔符切割并返回第 12 个值:
假设您要提取的字符串在您可以使用的每个文件中位于相同的位置
head
,tail
并且cut
使用管道的命令。例如:
这是一个将输出设置为变量的脚本示例:
脚本的输出将
db1.table4
是变量的值V1
。您可以在此处阅读有关这些命令的更多信息:
head
命令tail
命令cut
命令当然,您可以使用这些命令从文件中提取任何其他字符串。
您通常应该避免对结构化数据使用通用文本解析工具。由于您有一个 json 文件,因此使用专用的 json 解析器更安全、更简单。在您的情况下,您需要提取数组的第一个元素的值,该元素
args
本身就是顶级数组的第一个元素,即args
顶级 hash 的子元素$quer
:从这里开始,您不再拥有结构化数据,您需要求助于更粗略的方法。我不知道你想如何识别你的目标字符串,你没有解释。因此,根据您的实际需求,您可以执行以下操作:
跳过以
[
or开头的行]
,然后打印剩余行的第二个单词:打印第二行的第二个单词
在字符串之后打印最长的非空白部分
"select\n
:如果您准确解释我们应该如何知道要提取什么字符串,我可以给您一个更有针对性的答案。
为了完整起见,在您的具体示例中,我强调这将是不可移植的,并且如果您的输入数据以任何方式发生变化几乎肯定会失败,您可以直接使用简单的文本工具: