Yq
yq is a portable command-line YAML, JSON, XML, CSV, TOML, HCL and properties processor
Install / Use
/learn @mikefarah/YqREADME
yq
A lightweight and portable command-line YAML, JSON, INI and XML processor. yq uses jq (a popular JSON processor) like syntax but works with yaml files as well as json, kyaml, xml, ini, properties, csv and tsv. It doesn't yet support everything jq does - but it does support the most common operations and functions, and more is being added continuously.
yq is written in Go - so you can download a dependency free binary for your platform and you are good to go! If you prefer there are a variety of package managers that can be used as well as Docker and Podman, all listed below.
Quick Usage Guide
Basic Operations
Read a value:
yq '.a.b[0].c' file.yaml
Pipe from STDIN:
yq '.a.b[0].c' < file.yaml
Update a yaml file in place:
yq -i '.a.b[0].c = "cool"' file.yaml
Update using environment variables:
NAME=mike yq -i '.a.b[0].c = strenv(NAME)' file.yaml
Advanced Operations
Merge multiple files:
# merge two files
yq -n 'load("file1.yaml") * load("file2.yaml")'
# merge using globs (note: `ea` evaluates all files at once instead of in sequence)
yq ea '. as $item ireduce ({}; . * $item )' path/to/*.yml
Multiple updates to a yaml file:
yq -i '
.a.b[0].c = "cool" |
.x.y.z = "foobar" |
.person.name = strenv(NAME)
' file.yaml
Find and update an item in an array:
# Note: requires input file - add your file at the end
yq -i '(.[] | select(.name == "foo") | .address) = "12 cat st"' data.yaml
Convert between formats:
# Convert JSON to YAML (pretty print)
yq -Poy sample.json
# Convert YAML to JSON
yq -o json file.yaml
# Convert XML to YAML
yq -o yaml file.xml
See recipes for more examples and the documentation for more information.
Take a look at the discussions for common questions, and cool ideas
Install
Download the latest binary
wget
Use wget to download pre-compiled binaries. Choose your platform and architecture:
For Linux (example):
# Set your platform variables (adjust as needed)
VERSION=v4.2.0
PLATFORM=linux_amd64
# Download compressed binary
wget https://github.com/mikefarah/yq/releases/download/${VERSION}/yq_${PLATFORM}.tar.gz -O - |\
tar xz && sudo mv yq_${PLATFORM} /usr/local/bin/yq
# Or download plain binary
wget https://github.com/mikefarah/yq/releases/download/${VERSION}/yq_${PLATFORM} -O /usr/local/bin/yq &&\
chmod +x /usr/local/bin/yq
Latest version (Linux AMD64):
wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/local/bin/yq &&\
chmod +x /usr/local/bin/yq
Available platforms: linux_amd64, linux_arm64, linux_arm, linux_386, darwin_amd64, darwin_arm64, windows_amd64, windows_386, etc.
MacOS / Linux via Homebrew:
Using Homebrew
brew install yq
Linux via snap:
snap install yq
Snap notes
yq installs with strict confinement in snap, this means it doesn't have direct access to root files. To read root files you can:
sudo cat /etc/myfile | yq '.a.path'
And to write to a root file you can either use sponge:
sudo cat /etc/myfile | yq '.a.path = "value"' | sudo sponge /etc/myfile
or write to a temporary file:
sudo cat /etc/myfile | yq '.a.path = "value"' | sudo tee /etc/myfile.tmp
sudo mv /etc/myfile.tmp /etc/myfile
rm /etc/myfile.tmp
Run with Docker or Podman
One-time use:
# Docker - process files in current directory
docker run --rm -v "${PWD}":/workdir mikefarah/yq '.a.b[0].c' file.yaml
# Podman - same usage as Docker
podman run --rm -v "${PWD}":/workdir mikefarah/yq '.a.b[0].c' file.yaml
Security note: You can run yq in Docker with restricted privileges:
docker run --rm --security-opt=no-new-privileges --cap-drop all --network none \
-v "${PWD}":/workdir mikefarah/yq '.a.b[0].c' file.yaml
Pipe data via STDIN:
You'll need to pass the -i --interactive flag to Docker/Podman:
# Process piped data
docker run -i --rm mikefarah/yq '.this.thing' < myfile.yml
# Same with Podman
podman run -i --rm mikefarah/yq '.this.thing' < myfile.yml
Run commands interactively:
docker run --rm -it -v "${PWD}":/workdir --entrypoint sh mikefarah/yq
podman run --rm -it -v "${PWD}":/workdir --entrypoint sh mikefarah/yq
It can be useful to have a bash function to avoid typing the whole docker command:
yq() {
docker run --rm -i -v "${PWD}":/workdir mikefarah/yq "$@"
}
yq() {
podman run --rm -i -v "${PWD}":/workdir mikefarah/yq "$@"
}
Running as root:
yq's container image no longer runs under root (https://github.com/mikefarah/yq/pull/860). If you'd like to install more things in the container image, or you're having permissions issues when attempting to read/write files you'll need to either:
docker run --user="root" -it --entrypoint sh mikefarah/yq
podman run --user="root" -it --entrypoint sh mikefarah/yq
Or, in your Dockerfile:
FROM mikefarah/yq
USER root
RUN apk add --no-cache bash
USER yq
Missing timezone data
By default, the alpine image yq uses does not include timezone data. If you'd like to use the tz operator, you'll need to include this data:
FROM mikefarah/yq
USER root
RUN apk add --no-cache tzdata
USER yq
Podman with SELinux
If you are using podman with SELinux, you will need to set the shared volume flag :z on the volume mount:
-v "${PWD}":/workdir:z
GitHub Action
- name: Set foobar to cool
uses: mikefarah/yq@master
with:
cmd: yq -i '.foo.bar = "cool"' 'config.yml'
- name: Get an entry with a variable that might contain dots or spaces
id: get_username
uses: mikefarah/yq@master
with:
cmd: yq '.all.children.["${{ matrix.ip_address }}"].username' ops/inventories/production.yml
- name: Reuse a variable obtained in another step
run: echo ${{ steps.get_username.outputs.result }}
See https://mikefarah.gitbook.io/yq/usage/github-action for more.
Go Install:
go install github.com/mikefarah/yq/v4@latest
Community Supported Installation methods
As these are supported by the community :heart: - however, they may be out of date with the officially supported releases.
Please note that the Debian package (previously supported by @rmescandon) is no longer maintained. Please use an alternative installation method.
X-CMD
Checkout yq on x-cmd: https://x-cmd.com/mod/yq
- Instant Results: See the output of your yq filter in real-time.
- Error Handling: Encounter a syntax error? It will display the error message and the results of the closest valid filter
Thanks @edwinjhlee!
Nix
nix profile install nixpkgs#yq-go
See here
Webi
webi yq
See webi Supported by @adithyasunil26 (https://github.com/webinstall/webi-installers/tree/master/yq)
Arch Linux
pacman -S go-yq
Windows:
Using Chocolatey
choco install yq
Supported by @chillum (https://chocolatey.org/packages/yq)
Using scoop
scoop install main/yq
Using winget
winget install --id MikeFarah.yq
MacPorts:
Using MacPorts
sudo port selfupdate
sudo port install yq
Supported by @herbygillot (https://ports.macports.org/maintainer/github/herbygillot)
Alpine Linux
Alpine Linux v3.20+ (and Edge):
apk add yq-go
Alpine Linux up to v3.19:
apk add yq
Supported by Tuan Hoang (https://pkgs.alpinelinux.org/packages?name=yq-go)
Flox:
Flox can be used to install yq on Linux, MacOS, and Windows through WSL.
flox install yq
MacOS / Linux via gah:
Using gah
gah install yq
Features
- Detailed documentation with many examples
- Written in portable go, so you can download a lovely dependency free binary
- Uses similar syntax as
jqbut works with YAML, INI, JSON and XML files - Fully supports multi document yaml files
- Supports yaml front matter blocks (e.g. jekyll/assemble)
- Colorized yaml output
- Date/Time manipulation and formatting with TZ
- Deep data structures
- Sort keys
- Manipulate yaml comments, styling, [tags](https://mik
Related Skills
node-connect
339.5kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
xurl
339.5kA CLI tool for making authenticated requests to the X (Twitter) API. Use this skill when you need to post tweets, reply, quote, search, read posts, manage followers, send DMs, upload media, or interact with any X API v2 endpoint.
frontend-design
83.9kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
339.5kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
