如何在shell中使用漂亮的JSON文件进行打印>>串行字符串JSON>> ES _bulk?

时间:2014-09-16 00:51:43

标签: json shell elasticsearch jq

因此花了几天时间记住如何编写各种Unix工具,如sed,awk和grep,学习一些相对较新的工具,比如curl(我知道,对吧?我甚至打破gcc for the也许是20年来的第一次,但它很快就会回来了)并且在构建一个与AWS EC2上的Elasticsearch一起使用的小JSON数据库方面取得了很大进展。

但我刚刚遇到了批量索引的问题,因为ES _bulk端点要求文件基本上是JSON串行字符串,每个字符串都有\ n个终止符;我使用各种Web API和文件预处理/处理构建的内容非常简单,即人类可读。

是否有一个简单的shell脚本方法可以将所有漂亮的JSON简单地连接成字符串,而无需加载某些Java库或其他什么?我可以在预处理过程中将标记添加到基本文件中,以标记所需的\ n中断,如果这有助于解析,但如果有人对工具集有提示,我将不胜感激,因为我离这个小小的一步远离加入该项目。我觉得有脚本,我知道有一些库,但到目前为止我还没有找到任何简单的命令行工具来进行不合适的打印。

非常感谢任何提示,

干杯

西特

4 个答案:

答案 0 :(得分:11)

您可以尝试使用优秀的jq工具来解析shell中的JSON。要使用jq进行漂亮打印,您可以使用以下任一方法:

cat pretty-printed.json | jq -c .
jq -c . pretty-printed.json

-c(或--compact-output)告诉它不打印(这是默认设置)。 "。"告诉它返回JSON内容"按原样#34;除了重新格式化之外没有修改。它会被转储回stdout,因此您可以重定向输出或将其传递给其他东西。

P.S。我想解决同样的问题,并选择了这个选项。

答案 1 :(得分:2)

D_S_toowhite的答案不是一个直接的答案,但它让我以正确的方式思考,即问题是要删除所有的空白区域。我找到了一种使用命令行工具tr删除所有空格的简单方法:

tr -d [:space:] inputfile

:space:标签删除所有空格,制表符,空格,垂直制表符等。这样一个漂亮的JSON输入: -

{
    "version" : "4.0",
    "success" : true,
    "result" :
    {
            "Focus" : 0.000590008,
            "Arc" : 12
    }
}

成为此JSON序列字符串:

{"version":"4.0","success":true,"result":{"Focus":0.000590008,"Arc":12}}

我仍然需要解决\ n终止符,但我认为这至少在我的特殊情况下是微不足道的,只需在使用sed关闭括号对后附加。

非常感谢你的建议。

干杯

西特

答案 2 :(得分:0)

您可以尝试使用regexp查找/替换:

  1. 找到:" ^ \ s {2,}"替换为""
  2. 找到" \ n"替换""
  3. 请参阅:https://github.com/dzhibas/SublimePrettyJson/issues/17

答案 3 :(得分:0)

在npm的帮助下,

jsonlint很容易在命令行中启动和运行,并且可以通过一种简单的方式打印出来,并且不会出现任何问题。 JSON是给它一个缩进字符""。

jsonlint -t ""

作为命令行用户的奖励,我一直使用它来获取粘贴缓冲区(在Mac上)并将它们转换为其他内容,例如:

交换缓冲内容以获得JSON linted'压缩'格式:

pbpaste | jsonlint -t "" | pbcopy

交换缓冲区内容以获得漂亮的JSON打印格式:

pbpaste | jsonlint | pbcopy

您还可以将文件内容传递给文件的丑陋(和JSON linted)版本:

cat data-pretty.json | jsonlint -t "" > data-ugly.json