代码之家  ›  专栏  ›  技术社区  ›  drewrockshard

JQ原始JSON输出回车?

  •  1
  • drewrockshard  · 技术社区  · 6 年前

    请随意编辑标题;不确定如何使用它。我正在尝试将shell输出转换为JSON数据,以用于我为工作编写的报告系统。快速问题,无论我做什么,当我在slurp模式下接受原始输入并输出JSON时,数组中的最后一项都是空白的(“”)。我觉得这是个新手 jq 我遇到了一个问题,但不知道如何说出这个问题。不管我在shell和pipe上运行什么命令,都会发生这种情况 JQ :

    # rpm -qa | grep kernel | jq -R -s 'split("\n")'
    [
      "kernel-2.6.32-504.8.1.el6.x86_64",
      "kernel-firmware-2.6.32-696.20.1.el6.noarch",
      "kernel-headers-2.6.32-696.20.1.el6.x86_64",
      "dracut-kernel-004-409.el6_8.2.noarch",
      "abrt-addon-kerneloops-2.0.8-43.el6.x86_64",
      "kernel-devel-2.6.32-358.11.1.el6.x86_64",
      "kernel-2.6.32-131.4.1.el6.x86_64",
      "kernel-devel-2.6.32-696.20.1.el6.x86_64",
      "kernel-2.6.32-696.20.1.el6.x86_64",
      "kernel-devel-2.6.32-504.8.1.el6.x86_64",
      "libreport-plugin-kerneloops-2.0.9-33.el6.x86_64",
      ""
    ]
    

    感谢您的帮助。

    3 回复  |  直到 6 年前
        1
  •  3
  •   tripleee    6 年前

    每行以换行符结尾。要么删除最后一行,要么省略数组末尾的空元素。

    vnix$printf'foo\nbar\n'|
    >jq-r-s'.[:-1]拆分(“\n”)'
    [
    “福”
    “酒吧”
    ]
    
    vnix$printf'foo\nbar\n'|
    >jq-r-s'拆分(“\n”)[:-1]'
    [
    “福”
    “酒吧”
    ]
    < /代码> 
    
    

    符号x[:-1]retrieves the value of a string or arrayxwith the last element removed.这叫做”slice notation“。

    只是为了说明这一点,如果您采用字符串“foo\n”and split on newline,You get“foo”from before the newline and“”after it.

    要使其真正强大,可能只在最后一个字符确实是换行符的情况下才修剪它。

    vnix$printf'foo\nbar\n'|
    >jq-r-s'子('\n$“;”“)拆分('\n”)'
    [
    “福”
    “酒吧”
    ]
    
    vnix$printf'foo\nbar',|
    >注意,没有最后的^新行
    >jq-r-s'子('\n$“;”“)拆分('\n”)'
    [
    “福”
    “酒吧”
    ]
    < /代码> 
    
    
    vnix$ printf 'foo\nbar\n' |
    > jq -R -s '.[:-1] | split("\n")'
    [
      "foo",
      "bar"
    ]
    
    vnix$ printf 'foo\nbar\n' |
    > jq -R -s 'split("\n")[:-1]'
    [
      "foo",
      "bar"
    ]
    

    记号法x[:-1]检索字符串或数组的值x最后一个元素被移除。这叫做“切片符号”。

    如果你把绳子拿出来的话,把它拼出来就行了。"foo\n"在换行线上分开"foo"从新线前开始""之后。

    要使其真正健壮,可能只在最后一个字符是换行符时才对其进行修剪。

    vnix$ printf 'foo\nbar\n' |
    > jq -R -s 'sub("\n$";"") | split("\n")'
    [
      "foo",
      "bar"
    ]
    
    vnix$ printf 'foo\nbar' |
    > #  notice, no final ^ newine
    > jq -R -s 'sub("\n$";"") | split("\n")'
    [
      "foo",
      "bar"
    ]
    
        2
  •  3
  •   peak    6 年前

    假设您可以访问jq 1.5或更高版本,那么您可以完全经济地绕过这个问题。 inputs :

    jq -nR '[inputs]'
    

    只要确保包含-n选项,否则第一行将丢失。

        3
  •  1
  •   ganit44    6 年前

    您也可以使用

    rpm -qa | grep kernel | jq -R . | jq -s .
    

    以获得所需的结果。

    请看 https://github.com/stedolan/jq/issues/563