yq is a portable command-line YAML, JSON, XML, CSV, TOML and properties processor
Go to file
2022-01-15 17:45:45 +11:00
.github Bump golang compiler #1037 2021-12-21 09:38:28 +11:00
acceptance_tests Added XML encoding/decoding (#1067) 2022-01-15 11:57:59 +11:00
cmd Added XML encoding/decoding (#1067) 2022-01-15 11:57:59 +11:00
debian Update changelog for version v4.16.2 (#1046) 2022-01-03 09:20:13 +11:00
examples Added XML encoding/decoding (#1067) 2022-01-15 11:57:59 +11:00
github-action Bumping version 2021-11-24 10:59:31 +11:00
pkg/yqlib New merge flag (n) to only merge in new fields (#1038) 2022-01-15 15:48:34 +11:00
scripts chore: script to build the deb sources (#1045) 2021-12-23 11:43:21 +11:00
snap Bumping version 2021-12-21 09:41:46 +11:00
test Added XML encoding/decoding (#1067) 2022-01-15 11:57:59 +11:00
.dockerignore Added gosec 2021-03-03 19:44:34 +11:00
.gitignore chore: script to build the deb sources (#1045) 2021-12-23 11:43:21 +11:00
.golangci.yml enable more linters (#1043) 2021-12-21 09:30:08 +11:00
action.yml outputs support in the action 2021-06-09 08:49:04 +10:00
CODE_OF_CONDUCT.md Create CODE_OF_CONDUCT.md 2020-02-21 21:13:14 +11:00
CONTRIBUTING.md Update CONTRIBUTING.md 2020-02-21 21:16:47 +11:00
Dockerfile Fixed docker permission issue #1014 2021-12-02 20:06:51 +11:00
Dockerfile.dev Updating to go 1.17 to fix CVE #944 2021-10-02 15:12:57 +10:00
go.mod Added XML encoding/decoding (#1067) 2022-01-15 11:57:59 +11:00
go.sum Added XML encoding/decoding (#1067) 2022-01-15 11:57:59 +11:00
how-it-works.md Tweaking docs 2021-11-03 22:37:07 +11:00
LICENSE Added XML decoder (#1044) 2021-12-21 15:02:07 +11:00
Makefile Add support for Podman as well as Docker (#1026) 2021-12-02 10:01:44 +11:00
Makefile.variables Add support for Podman as well as Docker (#1026) 2021-12-02 10:01:44 +11:00
merge-array-by-key.sh Added credit for merge by array example 2021-11-29 20:56:04 +11:00
mkdocs.yml Removed user docs 2020-01-30 10:32:34 +11:00
README.md Arch Linux install instructions (#1059) 2022-01-03 09:20:38 +11:00
release_instructions.txt chore: script to build the deb sources (#1045) 2021-12-23 11:43:21 +11:00
release_notes.txt Preparing release notes 2022-01-15 17:45:45 +11:00
test.sh Added csv, tsv output formats 2021-12-02 20:06:51 +11:00
yq.go first cli 2020-10-27 16:45:16 +11:00

yq

Build Docker Pulls Github Releases (by Release) Go Report

a lightweight and portable command-line YAML processor. yq uses jq like syntax but works with yaml files as well as json. 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 e '.a.b[0].c' file.yaml

Pipe from STDIN:

cat file.yaml | yq e '.a.b[0].c' -

Update a yaml file, inplace

yq e -i '.a.b[0].c = "cool"' file.yaml

Update using environment variables

NAME=mike yq e -i '.a.b[0].c = strenv(NAME)' file.yaml

Merge multiple files

yq ea '. as $item ireduce ({}; . * $item )' path/to/*.yml

Multiple updates to a yaml file

yq e -i '
  .a.b[0].c = "cool" |
  .x.y.z = "foobar" |
  .person.name = strenv(NAME)
' file.yaml

See the documentation for more.

Install

Download the latest binary

wget

Use wget to download the pre-compiled binaries:

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

For instance, VERSION=v4.2.0 and BINARY=yq_linux_amd64

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 e '.a.path' - 

And to write to a root file you can either use sponge:

sudo cat /etc/myfile | yq e '.a.path = "value"' - | sudo sponge /etc/myfile

or write to a temporary file:

sudo cat /etc/myfile | yq e '.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...
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:

cat myfile.yml | docker run -i --rm mikefarah/yq e . -
cat myfile.yml | podman run -i --rm mikefarah/yq e . -

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 bash
USER yq

GitHub Action

  - name: Set foobar to cool
    uses: mikefarah/yq@master
    with:
      cmd: yq eval -i '.foo.bar = "cool"' 'config.yml'

See https://mikefarah.gitbook.io/yq/usage/github-action for more.

Go Get:

GO111MODULE=on go get github.com/mikefarah/yq/v4

Community Supported Installation methods

As these are supported by the community ❤️ - however, they may be out of date with the officially supported releases.

Webi

webi yq

See webi Supported by @adithyasunil26 (https://github.com/webinstall/webi-installers/tree/master/yq)

Arch Linux

pacman -S go-yq

Windows:

Chocolatey Chocolatey

choco install yq

Supported by @chillum (https://chocolatey.org/packages/yq)

Mac:

Using MacPorts

sudo port selfupdate
sudo port install yq

Supported by @herbygillot (https://ports.macports.org/maintainer/github/herbygillot)

Alpine Linux

  • Enable edge/community repo by adding $MIRROR/alpine/edge/community to /etc/apk/repositories
  • Update database index with apk update
  • Install yq with apk add yq

Supported by Tuan Hoang https://pkgs.alpinelinux.org/package/edge/community/x86/yq

On Ubuntu 16.04 or higher from Debian package:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys CC86BB64
sudo add-apt-repository ppa:rmescandon/yq
sudo apt update
sudo apt install yq -y

Supported by @rmescandon (https://launchpad.net/~rmescandon/+archive/ubuntu/yq)

Features

Usage

Check out the documentation for more detailed and advanced usage.

Usage:
  yq [flags]
  yq [command]

Available Commands:
  eval             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
  shell-completion Generate completion script

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 seperators before processing expression. This is a workaround for go-yaml to persist header content (default true)
  -h, --help                  help for yq
  -I, --indent int            sets indent level for output (default 2)
  -i, --inplace               update the yaml file inplace of first yaml file given.
  -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 yaml docs from scratch.
  -o, --output-format string  [yaml|y|json|j|props|p] output format type. (default "yaml")
  -P, --prettyPrint           pretty print, shorthand for '... style = ""'
      --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

Use "yq [command] --help" for more information about a command.

Known Issues / Missing Features

See tips and tricks for more common problems and solutions.