web-dev-qa-db-fra.com

JQ comment imprimer un caractère de nouvelle ligne et non un caractère de nouvelle ligne à partir de la valeur json

J'ai quelques journaux qui produisent des informations en JSON. C'est pour la collecte à elasticsearch.

Certains testeurs et opérateurs souhaitent pouvoir lire les journaux sur les serveurs.

Voici un exemple de JSON:

{
"@timestamp": "2015-09-22T10:54:35.449+02:00",
"@version": 1,
"HOSTNAME": "server1.example",
"level": "WARN",
"level_value": 30000,
"logger_name": "server1.example.adapter",
"message": "message"
"stack_trace": "ERROR LALALLA\nERROR INFO NANANAN\nSOME MORE ERROR INFO\nBABABABABABBA BABABABA ABABBABAA BABABABAB\n"
}

Etc.

Est-il possible de faire un saut de ligne Jq au lieu du\n char?

16
jjgong

L'entrée telle qu'elle a été donnée à l'origine n'est pas tout à fait valide JSON, et la sortie souhaitée n'est pas claire, mais les éléments suivants peuvent être intéressants. Il est écrit pour la version actuelle de jq (version 1.5) mais pourrait facilement être adapté pour jq 1.4:

def json2qjson:
  def pp: if type == "string" then "\"\(.)\""  else . end;
  . as $in
  | foreach keys[] as $k (null; null; "\"\($k)\": \($in[$k] | pp)" ) ;


def data: {
  "@timestamp": "2015-09-22T10:54:35.449+02:00",
  "@version": 1,
  "HOSTNAME": "server1.example",
  "level": "WARN",
  "level_value": 30000,
  "logger_name": "server1.example.adapter",
  "message": "message",
  "stack_trace": "ERROR LALALLA\nERROR INFO NANANAN\nSOME MORE ERROR INFO\nBABABABABABBA BABABABA ABABBABAA BABABABAB\n"
};

data | json2qjson

Production:

$ jq -rnf json2qjson.jq
"@timestamp": "2015-09-22T10:54:35.449+02:00"
"@version": 1
"HOSTNAME": "server1.example"
"level": "WARN"
"level_value": 30000
"logger_name": "server1.example.adapter"
"message": "message"
"stack_trace": "ERROR LALALLA
ERROR INFO NANANAN
SOME MORE ERROR INFO
BABABABABABBA BABABABA ABABBABAA BABABABAB
"
3
peak

Sûr! En utilisant le -r option, jq affichera le contenu des chaînes directement sur le terminal au lieu de sous forme de chaînes d'échappement JSON.

jq -r '.stack_trace'
41
user3899165

À moins que vous ne soyez contraint d'utiliser jqniquement, vous pouvez "corriger" (ou réellement "un-json-ify") jq sortir avec sed:

cat the-input | jq . | sed 's/\\n/\n/g'

Si vous avez également des onglets dans l'entrée (\t en JSON), puis:

cat the-input | jq . | sed 's/\\n/\n/g; s/\\t/\t/g'

Ce serait particulièrement pratique si votre stack_trace a été généré par Java (vous n'avez pas indiqué quelle est la source des journaux), car les lignes Java stacktrace commencent par <tab>at<space>.

Attention: naturellement, ce n'est pas correct, dans un sens que l'entrée JSON contenant \\n se traduira par une sortie "", mais il devrait en résulter une sortie "n". Bien que ce ne soit pas correct, c'est certainement suffisant pour jeter un coup d'œil aux données par les humains. Les modèles sed peuvent être encore améliorés pour prendre soin de cela (au détriment de la lisibilité).

3
Piotr Findeisen