AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1357926
Accepted
Aviator
Aviator
Asked: 2021-08-15 01:38:16 +0800 CST2021-08-15 01:38:16 +0800 CST 2021-08-15 01:38:16 +0800 CST

如何从 json 文件中提取字符串并放入变量中(Linux)

  • 772

我的一个 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。有人可以帮忙吗?

command-line
  • 3 3 个回答
  • 10163 Views

3 个回答

  • Voted
  1. codlord
    2021-08-15T01:48:33+08:002021-08-15T01:48:33+08:00

    看看命令行 JSON 处理器,jq例如安装:

    sudo apt install jq
    

    您想要的字符串不是 JSON 值,它是 JSON 值的一部分。所以我建议你jq用来获取你需要操作的字符串到一个变量中,例如:

    my_var=$(jq -r .[$quer].args[0].args[0] file1.json)
    

    这将为您提供一个包含 SELECT 语句的变量:

    select db1.table1 as tab1, db1.table2 as tab2, db1.table3 as tab3 from db1.table4 as tab4
    

    然后,您将需要使用其他工具(如 sed、awk、cut 等)从该变量中获取您想要的子字符串。对于您的特定情况,这将起作用,但当然可能不适用于不同的 SELECT 语句。按空格分隔符切割并返回第 12 个值:

    my_table=$(echo $my_var | cut -d' ' -f12)
    
    • 2
  2. Best Answer
    CrazyTux
    2021-08-15T03:32:59+08:002021-08-15T03:32:59+08:00
    1. 假设您要提取的字符串在您可以使用的每个文件中位于相同的位置head,tail并且cut使用管道的命令。

    2. 例如:

      $ head -6 file.json | tail -1 | cut -b 121-129
      db1.table
      
    3. 这是一个将输出设置为变量的脚本示例:

      #!/bin/bash
      v1=$(head -6 file.json | tail -1 | cut -b 121-130)
      echo "$v1"
      

    脚本的输出将db1.table4是变量的值V1。

    您可以在此处阅读有关这些命令的更多信息:

    • head命令
    • tail命令
    • cut命令

    当然,您可以使用这些命令从文件中提取任何其他字符串。

    • 2
  3. terdon
    2021-08-15T04:39:34+08:002021-08-15T04:39:34+08:00

    您通常应该避免对结构化数据使用通用文本解析工具。由于您有一个 json 文件,因此使用专用的 json 解析器更安全、更简单。在您的情况下,您需要提取数组的第一个元素的值,该元素args本身就是顶级数组的第一个元素,即args顶级 hash 的子元素$quer:

    $ jq '."$quer"."args"[0]["args"]' file.json
    [
      "select\n      db1.table1 as tab1,\n      db1.table2 as tab2,\n      db1.table3 as tab3\n      from db1.table4 as tab4"
    ]
    

    从这里开始,您不再拥有结构化数据,您需要求助于更粗略的方法。我不知道你想如何识别你的目标字符串,你没有解释。因此,根据您的实际需求,您可以执行以下操作:

    1. 跳过以[or开头的行],然后打印剩余行的第二个单词:

      $ jq '."$quer"."args"[0]["args"]' file.json | awk '/^[^][]/{print $2}'
      db1.table1
      
    2. 打印第二行的第二个单词

      $ jq '."$quer"."args"[0]["args"]' file.json | awk 'NR==2{print $2}'
      db1.table1
      
    3. 在字符串之后打印最长的非空白部分"select\n:

      $ jq '."$quer"."args"[0]["args"]' file.json | grep -oP '"select\\n\s*\K\S*'
      db1.table1
      

    如果您准确解释我们应该如何知道要提取什么字符串,我可以给您一个更有针对性的答案。


    为了完整起见,在您的具体示例中,我强调这将是不可移植的,并且如果您的输入数据以任何方式发生变化几乎肯定会失败,您可以直接使用简单的文本工具:

    $ grep -oP '"select\\n\s*\K\S*' file.json 
    db1.table1
    
    $ awk '$1=="\"select\\n"{print $2}' file.json 
    db1.table1
    
    $ sed -nE 's/.*"select\\n\s*(\S+).*/\1/p' file.json 
    db1.table1
    
    • 1

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve