| name | cli-productivity-1-jq-json-processing |
| description | Sub-skill of cli-productivity: 1. jq - JSON Processing (+1). |
| version | 1.0.0 |
| category | operations |
| type | reference |
| scripts_exempt | true |
1. jq - JSON Processing (+1)
1. jq - JSON Processing
Basic Operations:
echo '{"name":"John","age":30}' | jq '.'
curl -s https://api.github.com/repos/nodejs/node | jq '.stargazers_count'
echo '[1,2,3,4,5]' | jq '.[] | select(. > 2)'
echo '{"first":"John","last":"Doe"}' | jq '{fullName: (.first + " " + .last)}'
Common jq Patterns:
jq '{name: .name, stars: .stargazers_count}'
jq '.items | length'
jq '.items | first'
jq '.items | last'
jq '.items[0:5]'
jq '.[] | select(.status == "active")'
jq '.[] | select(.count > 100)'
jq '.[] | select(.name | contains("test"))'
jq 'sort_by(.date)'
jq 'sort_by(.date) | reverse'
jq 'group_by(.category)'
jq 'group_by(.category) | map({key: .[0].category, count: length})'
jq '.[] | {id, name}'
jq 'map({id: .id, upper_name: (.name | ascii_upcase)})'
Shell Functions for jq:
jqp() {
jq '.' "$1" | bat --language json
}
jqf() {
local file="$1"
local field="$2"
jq -r ".$field" "$file"
}
jqcount() {
jq 'if type == "array" then length else 1 end' "$1"
}
jqfilter() {
local file="$1"
local field="$2"
local value="$3"
jq --arg val "$value" ".[] | select(.$field == \$val)" "$file"
}
2. fzf - Fuzzy Finder
Basic Usage:
vim $(fzf)
fzf --preview 'bat --color=always {}'
fzf --multi
echo -e "apple\nbanana\norange" | fzf --query "an"
fzf Configuration:
export FZF_DEFAULT_OPTS='
--height 40%
--layout=reverse
--border
--preview-window=right:50%:wrap
--bind=ctrl-d:preview-page-down
--bind=ctrl-u:preview-page-up
'
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
export FZF_ALT_C_COMMAND='fd --type d --hidden --follow --exclude .git'
export FZF_CTRL_T_OPTS='--preview "bat --color=always --style=numbers --line-range=:500 {}"'
export FZF_ALT_C_OPTS='--preview "exa --tree --level=2 --color=always {}"'
Powerful fzf Functions:
fe() {
local file
file=$(fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}')
[[ -n "$file" ]] && ${EDITOR:-vim} "$file"
}
fcd() {
local dir
dir=$(fd --type d --hidden --follow --exclude .git | fzf --preview 'exa --tree --level=2 --color=always {}')
[[ -n "$dir" ]] && cd "$dir"
}
fkill() {
local pid
pid=$(ps aux | sed 1d | fzf --multi | awk '{print $2}')
[[ -n "$pid" ]] && echo "$pid" | xargs kill -9
}
fco() {
local branch
branch=$(git branch -a --color=always | grep -v '/HEAD' | fzf --ansi | sed 's/^[* ]*//' | sed 's#remotes/origin/##')
[[ -n "$branch" ]] && git checkout "$branch"
}
flog() {
git log --oneline --color=always | fzf --ansi --preview | awk
}
() {
cmd
cmd=$( | fzf -- | sed )
[[ -n ]] &&
}
() {
var
var=$( | fzf | -d= -f1)
[[ -n ]] &&
}
() {
container
container=$(docker ps --format | fzf | awk )
[[ -n ]] && docker -it sh
}