Wie wähle ich mehrere Felder in jq aus?

97

Meine Eingabedatei sieht ungefähr so ​​aus:

{
"login": "dmaxfield",
"id": 7449977,
...
}
{
"login": "dmaxfield",
"id": 7449977,
...
}

Ich kann alle Anmeldenamen damit erhalten: cat members | jq '.[].login'

aber ich konnte die Syntax nicht knacken, um sowohl das Login als auch die ID zu erhalten?

J. Groesser
quelle
Können Sie ein Beispiel dafür geben, wie Ihre erwartete Ausgabe aussehen sollte? Es gibt viele Möglichkeiten, wie die Login / ID-Paare dargestellt werden können.

Antworten:

138

Sie können jq '.[] | .login, .id'jedes Login gefolgt von seiner ID abrufen.


quelle
1
Die Beispieleingabe der Benutzer sieht zwar wie ein Strom von Objekten aus, aber aufgrund des von ihnen bereitgestellten Beispielskripts gehe ich davon aus, dass sie in ein Array eingeschlossen sind, das sie weggelassen haben.
1
@ SantiagoLapresta: Diese Annahme ist nicht erforderlich. jqfunktioniert hervorragend mit einer Folge von Objekten - der Array-Wrapper ist nicht erforderlich. Die ...Zeichenfolgen und das letzte nachfolgende Komma müssen entfernt werden, aber ich halte das für impliziert.
Peter V. Mørch
55
Oder wenn nur diese beiden Felder angezeigt werden sollen. jq '.[] | {login, id}'
Cameron Taggart
4
@CameronTaggart, was ist, wenn ich anzeigen möchte login.name? jq '.[] | {login.name, id}'scheint zu funktionieren, was ist der richtige Weg, bitte?
Zyxue
6
@zyxue Dies funktioniert:jq '.[] | {name: .login.name, id}'
Alex Grounds
64

Das funktioniert bei mir:

> echo '{"a":1,"b":2,"c":3}{"a":1,"b":2,"c":3}' | jq '{a,b}'
{
  "a": 1,
  "b": 2
}
{
  "a": 1,
  "b": 2
}
Peter V. Mørch
quelle
10

Um Werte auszuwählen, die auf verschiedenen Ebenen eingerückt sind (dh sowohl auf der ersten als auch auf der zweiten Ebene), können Sie Folgendes verwenden:

$ echo '[{"a":{"aa":1,"ab":2},"b":3,"c":4},{"a":{"aa":5,"ab":6},"b":7,"c":8}]'|jq '.[]|[.a.aa,.a.ab,.b]'

[
  1,
  2,
  3
]
[
  5,
  6,
  7
]
vreyespue
quelle
2

Geben Sie hier nur ein weiteres Beispiel an (jq-1.6):

Gehen Sie durch ein Array und wählen Sie ein Feld eines Objektelements und ein Objektfeld in diesem Objekt aus

echo '[{"id":1, "private_info": {"name": "Ivy", "age": 18}}, {"id":2, "private_info": {"name": "Tommy", "aga": 18}}]' | jq ".[] | {id: .id, name: .private_info.name}" -

{
  "id": 1,
  "name": "Ivy"
}
{
  "id": 2,
  "name": "Tommy"
}

Ohne die Beispieldaten:

jq ".[] | {id, name: .private_info.name}" -

.[]: Gehen Sie durch ein Array

{id, name: .private_info.name}: Nehmen Sie .id und .private_info.name und wickeln Sie es in ein Objekt mit den Feldnamen "id" bzw. "name" ein

WYC
quelle
Das Einwickeln in ein Objekt, um Struktur- / Schlüsselnamen beizubehalten, ist großartig, genau das, wonach ich suche
cryanbhu