yq
yq is a portable command-line YAML, JSON, XML, CSV, TOML and properties processor
Top Related Projects
Command-line JSON processor
Command-line YAML, XML, TOML processor - jq wrapper for YAML/XML/TOML documents
Select, put and delete data from JSON, TOML, YAML, XML and CSV files with a single tool. Supports conversion between formats and can be used as a Go package.
Pure Go implementation of jq
Quick Overview
yq is a lightweight and portable command-line YAML, JSON, and XML processor. It uses jq-like syntax but works with YAML, JSON, XML, CSV, and other data formats. yq is designed to be a powerful tool for parsing, manipulating, and transforming structured data on the command line.
Pros
- Multi-format support (YAML, JSON, XML, CSV)
- Familiar syntax for users of jq
- Cross-platform compatibility (Linux, macOS, Windows)
- Actively maintained and regularly updated
Cons
- Learning curve for complex operations
- May be overkill for simple YAML/JSON tasks
- Limited support for some advanced data manipulation compared to full-fledged programming languages
- Performance may be slower than native parsers for very large files
Code Examples
- Reading a specific field from a YAML file:
yq '.version' package.yaml
- Updating a nested value in a YAML file:
yq '.spec.template.spec.containers[0].image = "new-image:v2"' deployment.yaml
- Converting YAML to JSON:
yq -o=json input.yaml > output.json
- Merging multiple YAML files:
yq '. as $item ireduce ({}; . * $item )' file1.yaml file2.yaml file3.yaml
Getting Started
-
Install yq using one of the following methods:
- On macOS with Homebrew:
brew install yq
- On Linux with snap:
snap install yq
- Download the binary from the GitHub releases page
- On macOS with Homebrew:
-
Verify the installation:
yq --version
-
Basic usage:
# Read a value yq '.key' file.yaml # Update a value yq '.key = "new value"' -i file.yaml # Convert formats yq -o=json input.yaml > output.json
For more advanced usage and detailed documentation, refer to the official GitHub repository and documentation.
Competitor Comparisons
Command-line JSON processor
Pros of jq
- More mature and widely adopted project with extensive documentation
- Powerful and flexible for complex JSON transformations
- Faster performance for large JSON datasets
Cons of jq
- Limited to JSON processing only
- Steeper learning curve due to its unique query language
- Less intuitive for simple operations compared to yq
Code Comparison
yq example:
yq e '.users[] | select(.age > 30)' input.yaml
jq equivalent:
jq '.users[] | select(.age > 30)' input.json
Key Differences
- yq supports multiple formats (YAML, JSON, XML, properties), while jq focuses solely on JSON
- yq syntax is more aligned with familiar command-line tools, making it easier for beginners
- jq offers more advanced features for complex JSON manipulations
- yq provides a more consistent experience across different data formats
- jq has better performance for large-scale JSON processing tasks
Use Cases
- Choose yq for multi-format data processing and simpler operations
- Opt for jq when working exclusively with JSON and requiring advanced transformations
Both tools have their strengths, and the choice depends on specific project requirements and data formats involved.
Command-line YAML, XML, TOML processor - jq wrapper for YAML/XML/TOML documents
Pros of yq (kislyuk)
- Built on top of jq, leveraging its powerful JSON processing capabilities
- Supports YAML, JSON, XML, and TOML formats
- Provides Python API for integration into Python projects
Cons of yq (kislyuk)
- Slower performance compared to Go-based implementation
- Less extensive YAML-specific features and syntax
- Requires Python runtime environment
Code Comparison
yq (kislyuk):
import yaml
from yq import cli
data = yaml.safe_load(input_yaml)
result = cli.main(['--yaml-output', '.field.subfield'], data)
print(result)
yq (mikefarah):
yaml, err := yq.New().Evaluate(".field.subfield", []byte(input_yaml))
if err != nil {
log.Fatal(err)
}
fmt.Println(string(yaml))
Both projects aim to provide YAML processing capabilities, but they differ in implementation and features. The kislyuk version builds upon jq and offers multi-format support, while the mikefarah version is a standalone Go implementation focused on YAML processing. The choice between them depends on specific project requirements, performance needs, and preferred language ecosystem.
Select, put and delete data from JSON, TOML, YAML, XML and CSV files with a single tool. Supports conversion between formats and can be used as a Go package.
Pros of dasel
- Supports multiple data formats (JSON, YAML, TOML, XML, CSV)
- Can convert between different data formats
- Provides a more intuitive command-line syntax for some operations
Cons of dasel
- Less mature and less widely adopted compared to yq
- Fewer advanced features and options for complex data manipulation
- Slightly slower performance for large datasets
Code Comparison
yq:
yq '.users[] | select(.age > 30) | .name' input.yaml
dasel:
dasel select -f input.yaml -m '.users.#(age>30).name'
Both tools aim to provide command-line data processing capabilities, but they have different strengths and approaches. yq is more focused on YAML and JSON processing, offering a syntax similar to jq. dasel, on the other hand, supports a wider range of data formats and provides a unified syntax for working with different types of data.
yq has a larger user base and more extensive documentation, making it easier to find solutions and examples online. However, dasel's multi-format support and intuitive syntax for some operations make it a versatile choice for projects dealing with various data formats.
When choosing between the two, consider your specific use case, the data formats you'll be working with, and the level of community support you require.
Pure Go implementation of jq
Pros of gojq
- Pure Go implementation, no external dependencies
- Faster execution for complex JSON processing tasks
- Supports more jq features and syntax, closer to original jq
Cons of gojq
- Limited YAML support compared to yq
- Lacks some of yq's extended functionality for YAML manipulation
- Steeper learning curve for users not familiar with jq syntax
Code Comparison
gojq:
echo '{"foo": 42, "bar": "baz"}' | gojq '.foo'
yq:
yq e '.foo' input.yaml
Key Differences
- gojq focuses on JSON processing, while yq specializes in YAML manipulation
- yq offers a more intuitive syntax for YAML operations
- gojq provides better performance for complex JSON transformations
- yq has broader file format support (JSON, YAML, XML, properties)
Use Cases
- Choose gojq for:
- Complex JSON processing tasks
- Projects requiring strict jq compatibility
- Choose yq for:
- YAML-centric workflows
- Multi-format data manipulation
- Simpler syntax for basic operations
Both tools have their strengths, and the choice depends on specific project requirements and data formats involved.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
yq
a lightweight and portable command-line YAML, JSON and XML processor. yq
uses jq like syntax but works with yaml files as well as json, xml, 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
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
Merge multiple files
# merge two files
yq -n 'load("file1.yaml") * load("file2.yaml")'
# merge using globs:
# note the use of `ea` to evaluate all the 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:
yq '(.[] | select(.name == "foo") | .address) = "12 cat st"'
Convert JSON to YAML
yq -Poy sample.json
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, gzipped pre-compiled binaries:
For instance, VERSION=v4.2.0 and BINARY=yq_linux_amd64
Compressed via tar.gz
wget https://github.com/mikefarah/yq/releases/download/${VERSION}/${BINARY}.tar.gz -O - |\
tar xz && mv ${BINARY} /usr/bin/yq
Plain binary
wget https://github.com/mikefarah/yq/releases/download/${VERSION}/${BINARY} -O /usr/bin/yq &&\
chmod +x /usr/bin/yq
Latest version
wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq &&\
chmod +x /usr/bin/yq
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
Oneshot use:
docker run --rm -v "${PWD}":/workdir mikefarah/yq [command] [flags] [expression ]FILE...
Note that you can run yq
in docker without network access and other privileges if you desire,
namely --security-opt=no-new-privileges --cap-drop all --network none
.
podman run --rm -v "${PWD}":/workdir mikefarah/yq [command] [flags] [expression ]FILE...
Pipe in via STDIN:
You'll need to pass the -i\--interactive
flag to docker:
docker run -i --rm mikefarah/yq '.this.thing' < myfile.yml
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
Mac:
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
Features
- Detailed documentation with many examples
- Written in portable go, so you can download a lovely dependency free binary
- Uses similar syntax as
jq
but works with YAML, 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
- Deeply data structures
- Sort keys
- Manipulate yaml comments, styling, tags and anchors and aliases.
- Update in place
- Complex expressions to select and update
- Keeps yaml formatting and comments when updating (though there are issues with whitespace)
- Decode/Encode base64 data
- Load content from other files
- Convert to/from json/ndjson
- Convert to/from xml
- Convert to/from properties
- Convert to/from csv/tsv
- General shell completion scripts (bash/zsh/fish/powershell)
- Reduce to merge multiple files or sum an array or other fancy things.
- Github Action to use in your automated pipeline (thanks @devorbitus)
Usage
Check out the documentation for more detailed and advanced usage.
Usage:
yq [flags]
yq [command]
Examples:
# yq defaults to 'eval' command if no command is specified. See "yq eval --help" for more examples.
yq '.stuff' < myfile.yml # outputs the data at the "stuff" node from "myfile.yml"
yq -i '.stuff = "foo"' myfile.yml # update myfile.yml in place
Available Commands:
completion Generate the autocompletion script for the specified shell
eval (default) Apply the expression to each document in each yaml file in sequence
eval-all Loads _all_ yaml documents of _all_ yaml files and runs expression once
help Help about any command
Flags:
-C, --colors force print with colors
-e, --exit-status set exit status if there are no matches or null or false is returned
-f, --front-matter string (extract|process) first input as yaml front-matter. Extract will pull out the yaml content, process will run the expression against the yaml content, leaving the remaining data intact
--header-preprocess Slurp any header comments and separators before processing expression. (default true)
-h, --help help for yq
-I, --indent int sets indent level for output (default 2)
-i, --inplace update the file in place of first file given.
-p, --input-format string [yaml|y|xml|x] parse format for input. Note that json is a subset of yaml. (default "yaml")
-M, --no-colors force print with no colors
-N, --no-doc Don't print document separators (---)
-n, --null-input Don't read input, simply evaluate the expression given. Useful for creating docs from scratch.
-o, --output-format string [yaml|y|json|j|props|p|xml|x] output format type. (default "yaml")
-P, --prettyPrint pretty print, shorthand for '... style = ""'
-s, --split-exp string print each result (or doc) into a file named (exp). [exp] argument must return a string. You can use $index in the expression as the result counter.
--unwrapScalar unwrap scalar, print the value with no quotes, colors or comments (default true)
-v, --verbose verbose mode
-V, --version Print version information and quit
--xml-attribute-prefix string prefix for xml attributes (default "+")
--xml-content-name string name for xml content (if no attribute name is present). (default "+content")
Use "yq [command] --help" for more information about a command.
Known Issues / Missing Features
yq
attempts to preserve comment positions and whitespace as much as possible, but it does not handle all scenarios (see https://github.com/go-yaml/yaml/tree/v3 for details)- Powershell has its own...opinions on quoting yq
- "yes", "no" were dropped as boolean values in the yaml 1.2 standard - which is the standard yq assumes.
See tips and tricks for more common problems and solutions.
Top Related Projects
Command-line JSON processor
Command-line YAML, XML, TOML processor - jq wrapper for YAML/XML/TOML documents
Select, put and delete data from JSON, TOML, YAML, XML and CSV files with a single tool. Supports conversion between formats and can be used as a Go package.
Pure Go implementation of jq
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot