sirve scripts script que programacion pasar parametros para operaciones manejo español ejemplos comandos cadenas aritmeticas json linux bash grep xargs

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" }