2015-10-20 19 views
87

Tôi dường như không thể nhận được jq để xử lý "bình thường" trong đường ống vỏ. Ví dụ:Làm thế nào để sử dụng `jq` trong một đường ống vỏ?

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

kết quả bằng cách jq chỉ cần in văn bản trợ giúp *. Điều tương tự cũng sẽ xảy ra nếu tôi cố gắng để chuyển hướng đầu ra jq 's vào một tệp:

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

jq cố tình bailing ra nếu nó xác định rằng nó không được chạy từ một tty? Làm cách nào để ngăn chặn hành vi này để tôi có thể sử dụng jq trong một đường ống?


* (Tôi nhận ra ví dụ này chứa một useless use of cat, nó cho mục đích minh hoạ chỉ)

Trả lời

158

Bạn cần cung cấp một bộ lọc như là một đối số. Để vượt qua JSON qua chưa sửa đổi khác hơn so với in ấn khá jq cung cấp theo mặc định, sử dụng bộ lọc sắc .:

trường hợp
curl -s https://api.github.com/users/octocat/repos | jq '.' | cat 
+0

Tại sao các đường ống để "mèo"? Có thực sự cần thiết không? –

+15

Tôi để lại nó vì OP có nó; Tôi giả sử nó chỉ là một trình giữ chỗ để chỉ ra rằng 'jq' vừa đọc vừa đọc từ một đường ống và viết vào một đường ống khác. Nếu mong muốn chỉ đơn giản là nhìn thấy đầu ra của 'jq', thì bản thân' cat' là không cần thiết. – chepner

+3

(1) jq phiên bản 1.5 đã được cải tiến để. là không cần thiết trong các trường hợp như thế này. (2) Không cần báo giá ".". – peak

3

Một sử dụng tôi đã tìm thấy bản thân mình làm thường xuyên cũng là "Làm thế nào để xây dựng dữ liệu JSON để cung cấp các lệnh shell khác, ví dụ: curl? " Cách tôi làm điều này là sử dụng tùy chọn --null-input/-n:

Không đọc bất kỳ đầu vào nào! Thay vào đó, bộ lọc được chạy một lần bằng cách sử dụng null làm đầu vào. Điều này hữu ích khi sử dụng jq làm máy tính đơn giản hoặc để tạo dữ liệu JSON từ đầu.

Và một ví dụ đi qua nó vào curl:

jq -n '{key: "value"}' | curl -d @- \ 
    --url 'https://some.url.com' \ 
    -H 'Content-Type: application/json' \ 
    -H 'Accept: application/json' 
+4

Điều đó thật tuyệt, nhưng không chắc nó có liên quan đến câu hỏi này như thế nào không? – mgalgs

+1

@mgalgs Tôi thấy mình muốn tạo/sử dụng 'jq' khi bắt đầu đường ống vỏ thay vì ở giữa/cuối để lọc xuống một số dữ liệu.Ví dụ 'curl' là một ví dụ cơ bản, nhưng tôi thấy mình thường xuyên gõ tay vào dữ liệu JSON để' curl' và cố gắng trích dẫn đúng, vì vậy tôi nghĩ nó có thể hữu ích cho người khác. – mkobit

Các vấn đề liên quan