Convert Figma logo to code with AI

mikefarah logoyq

yq is a portable command-line YAML, JSON, XML, CSV, TOML and properties processor

12,086
591
12,086
172

Top Related Projects

30,342

Command-line JSON processor

2,601

Command-line YAML, XML, TOML processor - jq wrapper for YAML/XML/TOML documents

7,116

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.

3,279

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

  1. Reading a specific field from a YAML file:
yq '.version' package.yaml
  1. Updating a nested value in a YAML file:
yq '.spec.template.spec.containers[0].image = "new-image:v2"' deployment.yaml
  1. Converting YAML to JSON:
yq -o=json input.yaml > output.json
  1. Merging multiple YAML files:
yq '. as $item ireduce ({}; . * $item )' file1.yaml file2.yaml file3.yaml

Getting Started

  1. 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
  2. Verify the installation:

    yq --version
    
  3. 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

30,342

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.

2,601

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.

7,116

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.

3,279

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 Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

yq

Build Docker Pulls Github Releases (by Release) Go Report CodeQL

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

Chocolatey 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

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.