2

I am trying to extract some info about github repositories using its API, apparently jq is the way to go. I can use this command to view all the available info:

curl 'https://api.github.com/repos/tmux-plugins/tpm' | jq

Output:

{
  "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. How would I extract just the "description"?

  2. How do I extract the "language" & "description"?

I ask question 2 as I have seen examples online (when trying to find an answer for myself), that show multiple fields being extracted in one, this would be helpful to me and others finding this question. Thank you!

8

In all cases below, file.json is the name of a file containing your JSON document. You could obviously use jq as you've done in the question instead, and have it read from a pipe connected to the output of curl.

Pulling the requested fields out, one by one:

$ jq -r '.description' file.json
Tmux Plugin Manager
$ jq -r '.language' file.json
Shell

The -r option is used above (and below) to get the "raw data" rather than JSON encoded data.

Getting both at once (you'd have issues telling them apart if any of them contain embedded newline characters):

$ jq -r '.language, .description' file.json
Shell
Tmux Plugin Manager

Getting them as a CSV record (will be properly quoted so that embedded commas and newlines will be parsable by a CSV parser, and embedded double quotes will be CSV encoded too):

$ jq -r '[.language, .description] | @csv' file.json
"Shell","Tmux Plugin Manager"

Tab-delimited (embedded newlines and tabs will show up as \n and \t respectively):

$ jq -r '[.language, .description] | @tsv' file.json
Shell   Tmux Plugin Manager

Letting jq produce shell code containing two variable assignments. The values will be properly quoted for the shell.

$ jq -r '@sh "lang=\(.language)", @sh "desc=\(.description)"' file.json
lang='Shell'
desc='Tmux Plugin Manager'

Getting the shell to actually evaluate these statements:

$ 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"
1
  • 3
    Now THATS an answer! Not only showing what I asked, but go a step further too: How to format (\n/\t), as csv and the variable assignment is VERY clever, especially for scripting. Thank you so much, it is really appreciated. – 5c0tt Mar 3 at 9:56
1
  1. How would I extract just the "description"?
$ curl -s 'https://api.github.com/repos/tmux-plugins/tpm' | jq -r '.description'
Tmux Plugin Manager
  1. How do I extract the "language" & "description"?
$ curl -s 'https://api.github.com/repos/tmux-plugins/tpm'
   | jq -r '.language + ": " + .description'
Shell: Tmux Plugin Manager

The second terminal command should preferably be on just one row.
If you copy-paste the two lines in one go, try using shift + insert for pasting into the terminal.

Note: just remove the -r flag if you prefer to get the answers as strings.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.