Jak używać `jq` w potoku powłoki?

196

Nie mogę się jqzachowywać „normalnie” w potoku powłoki. Na przykład:

$ curl -s https://api.github.com/users/octocat/repos | jq | cat

powoduje jqpo prostu wydrukowanie tekstu pomocy *. To samo dzieje się, jeśli spróbuję przekierować jqdane wyjściowe do pliku:

$ curl -s https://api.github.com/users/octocat/repos | jq > /tmp/stuff.json

Czy jqcelowo ratuje się, jeśli stwierdzi, że nie jest uruchamiany przez tty? Jak mogę temu zapobiec, aby móc korzystać jqz potoku?


* (Zdaję sobie sprawę, że ten przykład zawiera bezużyteczne użycie kota ; służy to wyłącznie celom ilustracyjnym)

mgalgs
źródło

Odpowiedzi:

325

Musisz podać filtr jako argument. Aby przekazać JSON przez niezmodyfikowane inne niż ładna funkcja drukowania jq, domyślnie użyj filtra tożsamości .:

curl -s https://api.github.com/users/octocat/repos | jq '.' | cat
chepner
źródło
23
Zostawiłem to, ponieważ OP miało to; Zakładam, że to tylko symbol zastępczy wskazujący, że jqzarówno czyta z potoku, jak i pisze do innego potoku. Jeśli pragnie się po prostu zobaczyć wynik jq, to catsamo w sobie nie jest konieczne.
chepner
3
(1) jq wersja 1.5 została ulepszona, dzięki czemu. nie jest konieczne w takich przypadkach. (2) Nie ma potrzeby cytowania „.”.
szczyt
6
@peak Może nie być konieczne dla rurociągu, ale mam 1.5 i musiałem podać „.” przekierować wyjście do pliku.
MHarris,
2
Cytuję .z przyzwyczajenia, ponieważ moją standardową praktyką jest najpierw zobaczyć, jak wygląda JSON, a następnie wrócić i zacząć dodawać do filtra, który częściej trzeba będzie cytować.
chepner
6
@WalterTross Tak, a ja wyjaśniłem w komentarzu 18 miesięcy temu, dlaczego to zacytowałem.
chepner
15

Jednym z przypadków użycia, które często robię, jest „Jak na przykład skonstruować dane JSON w celu dostarczenia ich do innych poleceń powłoki curl?” Sposób, w jaki to robię, polega na użyciu --null-input/-nopcji:

Nie czytaj w ogóle żadnych danych wejściowych! Zamiast tego filtr jest uruchamiany raz, używając nulljako danych wejściowych. Jest to przydatne, gdy używasz go jqjako prostego kalkulatora lub do konstruowania danych JSON od zera.

I przykład przekazujący go do curl:

jq -n '{key: "value"}' | curl -d @- \
  --url 'https://some.url.com' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json'
mkobit
źródło
9
Fajnie, ale nie wiesz, jak to ma związek z tym pytaniem?
mgalgs
2
@mgalgs Stwierdziłem, że chcę generować / używać jqna początku potoku powłoki, a nie na środku / końcu do filtrowania niektórych danych. curlPrzykładem jest jeden podstawowy, ale znalazłem się często ręcznie wpisanie danych do JSON curli staramy się podając porządku, więc pomyślałem, że może to być przydatne dla innych.
mkobit