Você está reinventando a roda (e incorretamente). Use jq
para gerar seu JSON.
lsof -Pn |
awk '/LISTEN/ {print $1,$2,$3,$4, $5,$8,$9}' |
jq -R 'split(" ") |
{
command: .[0],
pid: .[1],
user: .[2],
fd: .[3],
protocol: "\(.[4]):\(.[5])",
host: .[6]
}'
Se você tiver uma versão de jq
compatível com expressões regulares, também poderá soltar a chamada para awk
:
lsof -Pn | jq -R '
select(match("LISTEN")) |
[splits(" *")] |
{
command: .[0],
pid: .[1],
user: .[2],
fd: .[3],
protocol: "\(.[4]):\(.[7])",
host: .[8]
}'