Làm thế nào để sử dụng `jq` trong một đường ống vỏ?


195

Tôi dường như không thể jqcư xử "bình thường" trong một đường ống vỏ. Ví dụ:

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

kết quả jqchỉ đơn giản là in ra văn bản trợ giúp của nó *. Điều tương tự cũng xảy ra nếu tôi cố chuyển hướng jqđầu ra của tệp sang tệp:

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

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


* (Tôi nhận ra ví dụ này chứa việc sử dụng mèo vô dụng ; nó chỉ nhằm mục đích minh họa)

Câu trả lời:


323

Bạn cần cung cấp một bộ lọc làm đối số. Để vượt qua JSON thông qua chưa sửa đổi, ngoài việc in ấn đẹp jqcung cấp theo mặc định, hãy sử dụng bộ lọc nhận dạng .:

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

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

3
(1) jq phiên bản 1.5 đã được cải tiến sao cho. là không cần thiết trong trường hợp như thế này. (2) Không cần trích dẫn ".".
cao điểm

6
@peak Có thể không cần thiết cho một đường ống, nhưng tôi có 1,5 và phải cung cấp "." để chuyển hướng đầu ra đến một tập tin.
MHarris

2
Tôi trích dẫn .thói quen này, vì thực tiễn tiêu chuẩn của tôi là trước tiên hãy xem JSON trông như thế nào, sau đó quay lại và bắt đầu thêm vào bộ lọc, thường không cần phải trích dẫn.
chepner

6
@WalterTross Có, và tôi đã giải thích trong một bình luận 18 tháng trước tại sao tôi trích dẫn nó.
chepner

15

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

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

Và một ví dụ chuyển nó vào curl:

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

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

2
@mgaches Tôi thấy mình muốn tạo / sử dụng jqkhi bắt đầu một đường ống vỏ thay vì ở giữa / cuối để lọc xuống một số dữ liệu. Các curlví dụ là một cơ bản, nhưng tôi thấy mình gõ thường xuyên tay trong dữ liệu JSON để curlvà cố gắng để có được trích dẫn đúng, vì vậy tôi nghĩ rằng nó có thể có ích cho người khác là tốt.
mkobit
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.