Existem duas maneiras óbvias de representar a saída de dados colunares em JSON: como uma matriz de matrizes e como uma matriz de objetos. No primeiro caso, você converte cada linha da entrada em uma matriz; no segundo, para um objeto.
Os comandos listados abaixo funcionam pelo menos com a saída de procps-ng no Linux para os comandos ps
e ps -l
.
Opção nº 1: matriz de matrizes
Usando o Perl
Você pode converter a saída usando Perl e o módulo CPAN JSON :: XS .
# ps | perl -MJSON -lane 'my @a = @F; push @data, \@a; END { print encode_json \@data }'
[["PID","TTY","TIME","CMD"],["12921","pts/2","00:00:00","ps"],["12922","pts/2","00:00:00","perl"],["28280","pts/2","00:00:01","zsh"]]
Usando jq
Como alternativa, você pode usar o próprio jq para realizar a conversão.
# ps | jq -sR '[sub("\n$";"") | splits("\n") | sub("^ +";"") | [splits(" +")]]'
[
[
"PID",
"TTY",
"TIME",
"CMD"
],
[
"16694",
"pts/2",
"00:00:00",
"ps"
],
[
"16695",
"pts/2",
"00:00:00",
"jq"
],
[
"28280",
"pts/2",
"00:00:02",
"zsh"
]
]
Opção nº 2: matriz de objetos
Você pode converter a entrada em uma matriz de objetos JSON com chaves nomeadas com significado, pegando os nomes das chaves da linha de cabeçalho.
Isso requer um pouco mais de esforço e é um pouco mais complicado em jq em particular. No entanto, o resultado é indiscutivelmente mais legível por humanos.
Usando o Perl
# ps | perl -MJSON -lane 'if (!@keys) { @keys = @F } else { my %h = map {($keys[$_], $F[$_])} 0..$#keys; push @data, \%h } END { print encode_json \@data }'
[{"TTY":"pts/2","CMD":"ps","TIME":"00:00:00","PID":"11030"},{"CMD":"perl","TIME":"00:00:00","PID":"11031","TTY":"pts/2"},{"TTY":"pts/2","CMD":"zsh","TIME":"00:00:01","PID":"28280"}]
Observe que as chaves estão em ordem arbitrária para cada entrada. Este é um artefato de como os hashes de Perl funcionam.
Usando jq
# ps | jq -sR '[sub("\n$";"") | splits("\n") | sub("^ +";"") | [splits(" +")]] | .[0] as $header | .[1:] | [.[] | [. as $x | range($header | length) | {"key": $header[.], "value": $x[.]}] | from_entries]'
[
{
"PID": "19978",
"TTY": "pts/2",
"TIME": "00:00:00",
"CMD": "ps"
},
{
"PID": "19979",
"TTY": "pts/2",
"TIME": "00:00:00",
"CMD": "jq"
},
{
"PID": "28280",
"TTY": "pts/2",
"TIME": "00:00:02",
"CMD": "zsh"
}
]