Shell

如何使用 jq 從 github api 中提取資訊欄位

  • March 3, 2021

我正在嘗試使用其 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
}
  1. 我將如何僅提取“描述”?
  2. 如何提取“語言”和“描述”?

我問了問題 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"

引用自:https://unix.stackexchange.com/questions/637319