Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to concat multiple fields to same line with jq [duplicate]

Tags:

json

bash

shell

jq

If I run:

cat <file> | jq 

I get:

{
  "user": "alex",
  "num": "486",
  "time": "Thu Jun  6 16:26:06 PDT 2019",
  "pwd": "/Users/alex/codes/ores/prompt-command",
  "pid": 11047,
  "exit_code": 0,
  "cmd": "echo '123'"
}
{
  "user": "john",
  "num": "487",
  "time": "Thu Jun  6 16:26:24 PDT 2019",
  "pwd": "/Users/alex/codes/ores/prompt-command",
  "pid": 11108,
  "exit_code": 5,
  "cmd": "echo '456'"
}
{
  "user": "alex",
  "num": "488",
  "time": "Thu Jun  6 16:26:59 PDT 2019",
  "pwd": "/Users/alex/codes/ores/prompt-command",
  "pid": 11141,
  "exit_code": 5,
  "cmd": "echo '789'"
}

but instead of all those fields, I just want some output like:

alex echo '123'
alex echo '789'

so I tried this:

cat <file> | jq -r '.user .cmd'

but that didn't work I got this error:

jq: error (at :63): Cannot index string with string "cmd"

I also want to filter it so I only see my commands, something like:

cat <file> | jq -r '.user=alex .cmd'
like image 238
Alexander Mills Avatar asked Dec 07 '22 12:12

Alexander Mills


2 Answers

Use @tsv to generated tab-separated values as output:

jq -r '[.user, .cmd] | @tsv' <yourfile

...emits, given your input file:

alex    echo '123'
john    echo '456'
alex    echo '789'

...though if you're filtering for only your user account, you can just print cmd directly, since the user value is known:

jq -r 'select(.user == "alex") | .cmd' 
like image 170
2 revs Avatar answered Dec 22 '22 01:12

2 revs


When you write .user .cmd you are asking for the "cmd" field of the JSON object at .user. To obtain both the .user and .cmd values, you could use the "," operator:

.user, .cmd

The above, however, will produce two lines. There are many options for emitting multiple values on a single line. You might wish to consider using string interpolation; or wrapping the values in square brackets and then using one of @csv, @tsv, or join/1; or using the -j command-line option.

This is all pretty clearly explained in the standard jq documentation (see e.g. https://stackoverflow.com/tags/jq/info), as is the use of select for making a selection.

like image 27
peak Avatar answered Dec 22 '22 00:12

peak