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


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

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

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

非常感谢任何提示,

干杯

希德


3874
2017-09-16 00:51


起源



答案:


你可以试试伟大的 JQ 用于在shell中解析JSON的工具。要使用jq进行漂亮打印,您可以使用以下任一方法:

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

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

附:我本来想解决同样的问题,并提出了这个选择。


9
2017-10-17 00:31



并重定向到另一个文件......? - myol


答案:


你可以试试伟大的 JQ 用于在shell中解析JSON的工具。要使用jq进行漂亮打印,您可以使用以下任一方法:

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

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

附:我本来想解决同样的问题,并提出了这个选择。


9
2017-10-17 00:31



并重定向到另一个文件......? - myol


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
2017-09-16 07:19



这种方法的问题在于,如果数据包含任何重要的空格(即,其中一个值是包含句子的字符串),它将被错误地剥离。 - benkc


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

  1. 找到:“^ \ s {2,}”替换为“”
  2. 找到“\ n”替换“”

看到这个: https://github.com/dzhibas/SublimePrettyJson/issues/17


0
2017-09-16 02:07





jsonlint 在npm的帮助下,很容易在命令行中启动和运行,并且打印出“no fluff”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

0
2017-11-13 17:26