Shell
如何使用 jq 從 github api 中提取資訊欄位
我正在嘗試使用其 API 提取有關 github 儲存庫的一些資訊,顯然
jq
是要走的路。我可以使用此命令查看所有可用資訊:curl 'https://api.github.com/repos/tmux-plugins/tpm' | jq
輸出:
{ "id": 19935788, "node_id": "MDEwOlJlcG9zaXRvcnkxOTkzNTc4OA==", "name": "tpm", "full_name": "tmux-plugins/tpm", "private": false, "owner": { "login": "tmux-plugins", "id": 8289877, "node_id": "MDEyOk9yZ2FuaXphdGlvbjgyODk4Nzc=", "avatar_url": "https://avatars.githubusercontent.com/u/8289877?v=4", "gravatar_id": "", "url": "https://api.github.com/users/tmux-plugins", "html_url": "https://github.com/tmux-plugins", "followers_url": "https://api.github.com/users/tmux-plugins/followers", "following_url": "https://api.github.com/users/tmux-plugins/following{/other_user}", "gists_url": "https://api.github.com/users/tmux-plugins/gists{/gist_id}", "starred_url": "https://api.github.com/users/tmux-plugins/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/tmux-plugins/subscriptions", "organizations_url": "https://api.github.com/users/tmux-plugins/orgs", "repos_url": "https://api.github.com/users/tmux-plugins/repos", "events_url": "https://api.github.com/users/tmux-plugins/events{/privacy}", "received_events_url": "https://api.github.com/users/tmux-plugins/received_events", "type": "Organization", "site_admin": false }, "html_url": "https://github.com/tmux-plugins/tpm", "description": "Tmux Plugin Manager", "fork": false, "url": "https://api.github.com/repos/tmux-plugins/tpm", "forks_url": "https://api.github.com/repos/tmux-plugins/tpm/forks", "keys_url": "https://api.github.com/repos/tmux-plugins/tpm/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/tmux-plugins/tpm/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/tmux-plugins/tpm/teams", "hooks_url": "https://api.github.com/repos/tmux-plugins/tpm/hooks", "issue_events_url": "https://api.github.com/repos/tmux-plugins/tpm/issues/events{/number}", "events_url": "https://api.github.com/repos/tmux-plugins/tpm/events", "assignees_url": "https://api.github.com/repos/tmux-plugins/tpm/assignees{/user}", "branches_url": "https://api.github.com/repos/tmux-plugins/tpm/branches{/branch}", "tags_url": "https://api.github.com/repos/tmux-plugins/tpm/tags", "blobs_url": "https://api.github.com/repos/tmux-plugins/tpm/git/blobs{/sha}", "git_tags_url": "https://api.github.com/repos/tmux-plugins/tpm/git/tags{/sha}", "git_refs_url": "https://api.github.com/repos/tmux-plugins/tpm/git/refs{/sha}", "trees_url": "https://api.github.com/repos/tmux-plugins/tpm/git/trees{/sha}", "statuses_url": "https://api.github.com/repos/tmux-plugins/tpm/statuses/{sha}", "languages_url": "https://api.github.com/repos/tmux-plugins/tpm/languages", "stargazers_url": "https://api.github.com/repos/tmux-plugins/tpm/stargazers", "contributors_url": "https://api.github.com/repos/tmux-plugins/tpm/contributors", "subscribers_url": "https://api.github.com/repos/tmux-plugins/tpm/subscribers", "subscription_url": "https://api.github.com/repos/tmux-plugins/tpm/subscription", "commits_url": "https://api.github.com/repos/tmux-plugins/tpm/commits{/sha}", "git_commits_url": "https://api.github.com/repos/tmux-plugins/tpm/git/commits{/sha}", "comments_url": "https://api.github.com/repos/tmux-plugins/tpm/comments{/number}", "issue_comment_url": "https://api.github.com/repos/tmux-plugins/tpm/issues/comments{/number}", "contents_url": "https://api.github.com/repos/tmux-plugins/tpm/contents/{+path}", "compare_url": "https://api.github.com/repos/tmux-plugins/tpm/compare/{base}...{head}", "merges_url": "https://api.github.com/repos/tmux-plugins/tpm/merges", "archive_url": "https://api.github.com/repos/tmux-plugins/tpm/{archive_format}{/ref}", "downloads_url": "https://api.github.com/repos/tmux-plugins/tpm/downloads", "issues_url": "https://api.github.com/repos/tmux-plugins/tpm/issues{/number}", "pulls_url": "https://api.github.com/repos/tmux-plugins/tpm/pulls{/number}", "milestones_url": "https://api.github.com/repos/tmux-plugins/tpm/milestones{/number}", "notifications_url": "https://api.github.com/repos/tmux-plugins/tpm/notifications{?since,all,participating}", "labels_url": "https://api.github.com/repos/tmux-plugins/tpm/labels{/name}", "releases_url": "https://api.github.com/repos/tmux-plugins/tpm/releases{/id}", "deployments_url": "https://api.github.com/repos/tmux-plugins/tpm/deployments", "created_at": "2014-05-19T09:18:38Z", "updated_at": "2021-03-03T04:30:43Z", "pushed_at": "2021-02-23T11:07:55Z", "git_url": "git://github.com/tmux-plugins/tpm.git", "ssh_url": "git@github.com:tmux-plugins/tpm.git", "clone_url": "https://github.com/tmux-plugins/tpm.git", "svn_url": "https://github.com/tmux-plugins/tpm", "homepage": null, "size": 204, "stargazers_count": 6861, "watchers_count": 6861, "language": "Shell", "has_issues": true, "has_projects": true, "has_downloads": true, "has_wiki": true, "has_pages": false, "forks_count": 251, "mirror_url": null, "archived": false, "disabled": false, "open_issues_count": 79, "license": { "key": "mit", "name": "MIT License", "spdx_id": "MIT", "url": "https://api.github.com/licenses/mit", "node_id": "MDc6TGljZW5zZTEz" }, "forks": 251, "open_issues": 79, "watchers": 6861, "default_branch": "master", "temp_clone_token": null, "organization": { "login": "tmux-plugins", "id": 8289877, "node_id": "MDEyOk9yZ2FuaXphdGlvbjgyODk4Nzc=", "avatar_url": "https://avatars.githubusercontent.com/u/8289877?v=4", "gravatar_id": "", "url": "https://api.github.com/users/tmux-plugins", "html_url": "https://github.com/tmux-plugins", "followers_url": "https://api.github.com/users/tmux-plugins/followers", "following_url": "https://api.github.com/users/tmux-plugins/following{/other_user}", "gists_url": "https://api.github.com/users/tmux-plugins/gists{/gist_id}", "starred_url": "https://api.github.com/users/tmux-plugins/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/tmux-plugins/subscriptions", "organizations_url": "https://api.github.com/users/tmux-plugins/orgs", "repos_url": "https://api.github.com/users/tmux-plugins/repos", "events_url": "https://api.github.com/users/tmux-plugins/events{/privacy}", "received_events_url": "https://api.github.com/users/tmux-plugins/received_events", "type": "Organization", "site_admin": false }, "network_count": 251, "subscribers_count": 83 }
- 我將如何僅提取“描述”?
- 如何提取“語言”和“描述”?
我問了問題 2,因為我在網上看到了一些範例(當我試圖為自己尋找答案時),這些範例顯示多個欄位被提取到一個中,這對我和其他人找到這個問題會有幫助。謝謝!
在以下所有情況下,
file.json
是包含您的 JSON 文件的文件的名稱。您顯然可以jq
像在問題中所做的那樣使用它,並從連接到輸出的管道中讀取它curl
。將請求的欄位一一拉出:
$ jq -r '.description' file.json Tmux Plugin Manager $ jq -r '.language' file.json Shell
該
-r
選項在上面(和下面)用於獲取“原始數據”而不是 JSON 編碼數據。同時獲取兩者(如果它們中的任何一個包含嵌入的換行符,您將無法區分它們):
$ jq -r '.language, .description' file.json Shell Tmux Plugin Manager
將它們作為 CSV 記錄獲取(將被正確引用,以便 CSV 解析器可以解析嵌入的逗號和換行符,並且嵌入的雙引號也將被 CSV 編碼):
$ jq -r '[.language, .description] | @csv' file.json "Shell","Tmux Plugin Manager"
製表符分隔(嵌入的換行符和製表符將分別顯示為
\n
和\t
):$ jq -r '[.language, .description] | @tsv' file.json Shell Tmux Plugin Manager
讓
jq
生成包含兩個變數賦值的 shell 程式碼。這些值將被正確引用到 shell 中。$ jq -r '@sh "lang=\(.language)", @sh "desc=\(.description)"' file.json lang='Shell' desc='Tmux Plugin Manager'
讓 shell 實際評估這些語句:
$ eval "$( jq -r '@sh "lang=\(.language)", @sh "desc=\(.description)"' file.json )" $ printf 'lang is "%s" and desc is "%s"\n' "$lang" "$desc" lang is "Shell" and desc is "Tmux Plugin Manager"