json - que - scripts bash ejemplos
En Bash, ¿cómo puedo analizar múltiples objetos JSON delimitados por nueva línea desde un archivo de registro? (1)
Estoy analizando un archivo de registro y obtengo líneas de resultados (usando grep) como las siguientes:
2017-01-26 17:19:40 +0000 docker: {"source":"stdout","log":"I, [2017-01-26T17:19:40.703988 #24] INFO -- : {/"tags/":/"structured_log/",/"payload/":{/"results/":[{/"baserate/":/"-1/"}]},/"commit_stamp/":1485451180,/"resource/":/"google_price_result_metric/",/"object_id/":/"20170126171940700/"}","container_id":"6ecbf7f64e4c9557e9dd1efbc6666a3c6c53f9cd5c18414ed5633cad8c302e","container_name":"/test-container-b49c8188c3ebe4b93300"}
2017-01-26 17:19:40 +0000 docker: {"container_id":"6ecbf7f64e4c9557e9dd1efbc6666a3c6c53f9cd5c18414ed5633cad8c302e","container_name":"/test-container-b49c8188c3ebe4b93300","source":"stdout","log":"I, [2017-01-26T17:19:40.704364 #24] INFO -- : method=POST path=/prices.xml format=xml controller=TestController action=prices status=200 duration=1686.51 view=0.08 db=0.62"}
Luego extraigo los objetos JSON con el siguiente comando:
... | grep -o -E "/{.*$"
Sé que puedo analizar una sola línea con python -mjson.tool
así:
... | grep -o -E "/{.*$" | tail -n1 | python -mjson.tool
Pero quiero analizar ambas líneas (o n líneas). ¿Cómo puedo hacer esto en bash? (Creo que se supone que xargs me deja hacer esto, pero soy nuevo en la herramienta y no puedo entenderlo)
Puede jq
que acepte texto sin formato como entrada, e intente analizar un subconjunto extraído como JSON. Considere el siguiente ejemplo, probado con jq 1.5:
jq -R ''capture("docker: (?<json>[{].*[}])$") | .json? | select(.) | fromjson'' <<''EOF''
2017-01-26 17:19:40 +0000 docker: {"source":"stdout","log":"I, [2017-01-26T17:19:40.703988 #24] INFO -- : {/"tags/":/"structured_log/",/"payload/":{/"results/":[{/"baserate/":/"-1/"}]},/"commit_stamp/":1485451180,/"resource/":/"google_price_result_metric/",/"object_id/":/"20170126171940700/"}","container_id":"6ecbf7f64e4c9557e9dd1efbc6666a3c6c53f9cd5c18414ed5633cad8c302e","container_name":"/test-container-b49c8188c3ebe4b93300"}
2017-01-26 17:19:40 +0000 docker: {"container_id":"6ecbf7f64e4c9557e9dd1efbc6666a3c6c53f9cd5c18414ed5633cad8c302e","container_name":"/test-container-b49c8188c3ebe4b93300","source":"stdout","log":"I, [2017-01-26T17:19:40.704364 #24] INFO -- : method=POST path=/prices.xml format=xml controller=TestController action=prices status=200 duration=1686.51 view=0.08 db=0.62"}
EOF
... rinde adecuadamente:
{
"source": "stdout",
"log": "I, [2017-01-26T17:19:40.703988 #24] INFO -- : {/"tags/":/"structured_log/",/"payload/":{/"results/":[{/"baserate/":/"-1/"}]},/"commit_stamp/":1485451180,/"resource/":/"google_price_result_metric/",/"object_id/":/"20170126171940700/"}",
"container_id": "6ecbf7f64e4c9557e9dd1efbc6666a3c6c53f9cd5c18414ed5633cad8c302e",
"container_name": "/test-container-b49c8188c3ebe4b93300"
}
{
"container_id": "6ecbf7f64e4c9557e9dd1efbc6666a3c6c53f9cd5c18414ed5633cad8c302e",
"container_name": "/test-container-b49c8188c3ebe4b93300",
"source": "stdout",
"log": "I, [2017-01-26T17:19:40.704364 #24] INFO -- : method=POST path=/prices.xml format=xml controller=TestController action=prices status=200 duration=1686.51 view=0.08 db=0.62"
}