JQ: ошибка (в состоянии EC: 1028): не может перебрать ноль (ноль) - PullRequest
0 голосов
/ 14 марта 2019

У меня длинный JSON-файл, и я выполняю команду, чтобы получить вывод, показанный ниже:

jq -s '.[]
  | ."lrouter/show"[]
  |  del( . | select(.type == "TUNNEL-VRF"))
  | del(.ports[] | select(.type == "blackhole" or .type == "cpu-port" or .type == "loopback"))
  | "Name: \(.name)" ,
    "UUID: \(.uuid)" ,
   (.ports[] | {Port_Name: .name,
                Port_Type: .type, 
                Port_Peer: .peer,
                Port_IPs: .ips[],
                Port_Admin_Up: .admin_up, 
                Port_Op_State: .op_state_up } )' ec-state

"Name: SR-t0-uplink"
"UUID: 23354d26-6994-46d9-b78c-bb565a1c13f2"
{
  "Port_Name": "uplink",
  "Port_Type": "uplink",
  "Port_Peer": "d78089f6-71b5-4c8e-a477-69ee01f17c5c",
  "Port_IPs": "1.1.13.5/24",
  "Port_Admin_Up": true,
  "Port_Op_State": true
}
{
  "Port_Name": "bp-sr0-port",
  "Port_Type": "backplane",
  "Port_Peer": null,
  "Port_IPs": "169.254.0.2/28",
  "Port_Admin_Up": false,
  "Port_Op_State": false
}
jq: error (at ec-state:1028): Cannot iterate over null (null)

Я получаю желаемый результат, но в конце результата я получаю также ошибку jq. Просто любопытно узнать, что я делаю неправильно с запросом.

1 Ответ

0 голосов
/ 14 марта 2019

Поскольку ваш ввод велик, вы можете подумать о добавлении утверждений или их эквивалента.Поскольку ваша программа, очевидно, ожидает массивы в различных точках, вы могли бы оснастить ее такой функцией, как:

def q($n; $msg):
  if type == "array" or type == "object" 
  then .
  else error("\($msg): composite expected @ \($n) vs \(.)")
  end;

Тогда ваша программа может быть оснащена следующим образом:

range(0;length) as $n
  | .[$n]
  | ."lrouter/show" | q($n; 2) | .[]
  | del( . | select(.type == "TUNNEL-VRF"))
  | del(.ports | q($n; 3) | .[] | select(.type == "blackhole" or .type == "cpu-port" or .type == "loopback"))
  | "Name: \(.name)" ,
    "UUID: \(.uuid)" ,
   (.ports[] | {Port_Name: .name,
                Port_Type: .type, 
                Port_Peer: .peer,
                Port_IPs: (.ips | q($n; 4) |.[]),
                Port_Admin_Up: .admin_up, 
                Port_Op_State: .op_state_up } )
...