yq/README.md

235 lines
8.8 KiB
Markdown
Raw Normal View History

2019-05-14 17:28:06 +00:00
# yq
2018-07-31 09:04:34 +00:00
2020-02-26 10:14:15 +00:00
![Build](https://github.com/mikefarah/yq/workflows/Build/badge.svg) ![Docker Pulls](https://img.shields.io/docker/pulls/mikefarah/yq.svg) ![Github Releases (by Release)](https://img.shields.io/github/downloads/mikefarah/yq/total.svg) ![Go Report](https://goreportcard.com/badge/github.com/mikefarah/yq)
2018-07-10 11:46:36 +00:00
2020-12-30 22:22:22 +00:00
a lightweight and portable command-line YAML processor. `yq` uses [jq](https://github.com/stedolan/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.
2015-09-27 03:29:20 +00:00
2020-12-30 22:22:22 +00:00
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, all listed below.
2015-09-27 03:29:20 +00:00
2020-12-20 02:34:58 +00:00
## V4 released!
V4 is now officially released, it's quite different from V3 (sorry for the migration), however it is much more similar to ```jq```, using a similar expression syntax and therefore support much more complex functionality!
If you've been using v3 and want/need to upgrade, checkout the [upgrade guide](https://mikefarah.gitbook.io/yq/v/v4.x/upgrading-from-v3).
2021-01-06 04:33:20 +00:00
Support for v3 will cease August 2021, until then, critical bug and security fixes will still get applied if required.
2015-11-20 10:42:45 +00:00
## Install
2020-01-11 00:44:02 +00:00
2020-02-21 10:07:37 +00:00
### [Download the latest binary](https://github.com/mikefarah/yq/releases/latest)
2020-01-30 23:37:27 +00:00
2020-12-30 22:22:18 +00:00
### wget
Use wget to download the pre-compiled binaries:
2020-12-30 22:33:15 +00:00
#### Compressed via tar.gz
2020-12-30 22:30:59 +00:00
```bash
wget https://github.com/mikefarah/yq/releases/download/${VERSION}/${BINARY}.tar.gz -O - |\
tar xz && mv ${BINARY} /usr/bin/yq
```
2020-12-30 22:33:15 +00:00
#### Plain binary
2020-12-30 22:30:59 +00:00
2020-12-30 22:22:18 +00:00
```bash
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](https://brew.sh/)
2017-12-24 19:30:49 +00:00
```
brew install yq
```
2020-04-22 13:29:44 +00:00
2021-01-06 04:33:20 +00:00
or, for the (deprecated) v3 version:
2021-01-06 04:22:29 +00:00
```
brew install yq@3
```
Note that for v3, as it is a versioned brew it will not add the `yq` command to your path automatically. Please follow the instructions given by brew upon installation.
2020-12-30 22:22:18 +00:00
### Linux via snap:
```
snap install yq
```
2021-01-06 04:33:20 +00:00
or, for the (deprecated) v3 version:
2021-01-05 02:03:36 +00:00
```
snap install yq --channel=v3/stable
```
#### Snap notes
2020-05-23 14:30:00 +00:00
`yq` installs with [_strict confinement_](https://docs.snapcraft.io/snap-confinement/6233) 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](https://linux.die.net/man/1/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
#### Oneshot use:
```bash
docker run --rm -v "${PWD}":/workdir mikefarah/yq <command> [flags] [expression ]FILE...
```
#### Run commands interactively:
```bash
2021-01-14 22:44:02 +00:00
docker 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:
```bash
yq() {
docker run --rm -i -v "${PWD}":/workdir mikefarah/yq "$@"
}
```
2021-07-08 00:02:23 +00:00
#### Running as root:
2021-07-16 00:06:28 +00:00
`yq`'s docker image no longer runs under root (https://github.com/mikefarah/yq/pull/860). If you'd like to install more things in the docker image, or you're having permissions issues when attempting to read/write files you'll need to either:
2021-07-08 00:02:23 +00:00
```
docker run --user="root" -it --entrypoint sh mikefarah/yq
```
Or, in your docker file:
```
FROM mikefarah/yq
USER root
RUN apk add bash
USER yq
```
### Go Get:
```
GO111MODULE=on go get github.com/mikefarah/yq/v4
```
## Community Supported Installation methods
As these are supported by the community :heart: - however, they may be out of date with the officially supported releases.
2021-01-08 01:14:36 +00:00
# Webi
```
webi yq
```
See [webi](https://webinstall.dev/)
Supported by @adithyasunil26 (https://github.com/webinstall/webi-installers/tree/master/yq)
### Windows:
2021-03-23 09:40:39 +00:00
[![Chocolatey](https://img.shields.io/chocolatey/v/yq.svg)](https://chocolatey.org/packages/yq)
[![Chocolatey](https://img.shields.io/chocolatey/dt/yq.svg)](https://chocolatey.org/packages/yq)
```
choco install yq
```
Supported by @chillum (https://chocolatey.org/packages/yq)
### Mac:
Using [MacPorts](https://www.macports.org/)
```
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:
```sh
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)
2015-10-13 10:31:02 +00:00
## Features
2021-03-19 00:52:13 +00:00
- [Detailed documentation with many examples](https://mikefarah.gitbook.io/yq/)
2015-10-13 10:31:02 +00:00
- Written in portable go, so you can download a lovely dependency free binary
- Uses similar syntax as `jq` but works with YAML and JSON files
- Fully supports multi document yaml files
- Colorized yaml output
2021-03-19 00:52:13 +00:00
- [Deeply traverse yaml](https://mikefarah.gitbook.io/yq/operators/traverse-read)
- [Sort yaml by keys](https://mikefarah.gitbook.io/yq/operators/sort-keys)
- Manipulate yaml [comments](https://mikefarah.gitbook.io/yq/operators/comment-operators), [styling](https://mikefarah.gitbook.io/yq/operators/style), [tags](https://mikefarah.gitbook.io/yq/operators/tag) and [anchors and aliases](https://mikefarah.gitbook.io/yq/operators/anchor-and-alias-operators).
- [Update yaml inplace](https://mikefarah.gitbook.io/yq/v/v4.x/commands/evaluate#flags)
2021-03-19 00:52:13 +00:00
- [Complex expressions to select and update](https://mikefarah.gitbook.io/yq/operators/select#select-and-update-matching-values-in-map)
- Keeps yaml formatting and comments when updating (though there are issues with whitespace)
- [Convert to/from json to yaml](https://mikefarah.gitbook.io/yq/v/v4.x/usage/convert)
- [Pipe data in by using '-'](https://mikefarah.gitbook.io/yq/v/v4.x/commands/evaluate)
2020-12-20 02:34:58 +00:00
- [General shell completion scripts (bash/zsh/fish/powershell)](https://mikefarah.gitbook.io/yq/v/v4.x/commands/shell-completion)
2021-02-25 06:04:08 +00:00
- [Reduce](https://mikefarah.gitbook.io/yq/operators/reduce) to merge multiple files or sum an array or other fancy things.
2021-06-08 22:57:42 +00:00
- [Github Action](https://mikefarah.gitbook.io/yq/usage/github-action) to use in your automated pipeline (thanks @devorbitus)
2015-09-29 00:20:31 +00:00
2020-01-29 22:58:21 +00:00
## [Usage](https://mikefarah.gitbook.io/yq/)
2017-04-13 05:44:31 +00:00
2020-01-29 22:58:21 +00:00
Check out the [documentation](https://mikefarah.gitbook.io/yq/) for more detailed and advanced usage.
2017-04-13 05:44:31 +00:00
2015-09-27 03:29:20 +00:00
```
2017-04-14 02:40:03 +00:00
Usage:
2017-12-17 22:11:08 +00:00
yq [flags]
yq [command]
2015-09-27 03:40:09 +00:00
2017-04-14 02:40:03 +00:00
Available Commands:
eval Apply expression to each document in each yaml file given in sequence
eval-all Loads _all_ yaml documents of _all_ yaml files and runs expression once
2020-06-11 23:30:05 +00:00
help Help about any command
shell-completion Generate completion script
2015-10-05 03:41:01 +00:00
2017-04-14 02:40:03 +00:00
Flags:
-C, --colors force print with colors
-e, --exit-status set exit status if there are no matches or null or false is returned
2020-02-03 05:37:53 +00:00
-h, --help help for yq
2020-02-07 00:26:29 +00:00
-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.
2020-12-28 00:57:20 +00:00
-P, --prettyPrint pretty print, shorthand for '... style = ""'
-j, --tojson output as json. Set indent to 0 to print json in one line.
2020-02-03 05:37:53 +00:00
-v, --verbose verbose mode
-V, --version Print version information and quit
2015-10-05 23:01:33 +00:00
2017-12-17 22:11:08 +00:00
Use "yq [command] --help" for more information about a command.
2015-09-29 06:29:32 +00:00
```
2020-09-03 00:58:00 +00:00
Simple Example:
```bash
yq e '.a.b | length' f1.yml f2.yml
```
2020-09-16 05:42:09 +00:00
## Known Issues / Missing Features
2020-09-03 00:58:00 +00:00
- `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)
2021-07-16 00:06:28 +00:00
- Powershell has its own...opinions: https://mikefarah.gitbook.io/yq/usage/tips-and-tricks#quotes-in-windows-powershell
- Running expressions against blank files does not work, because the file is empty, there are no matches for yq to run through the expression pipeline and so nothing happens. Instead, you can do something like `yq e -n '.someNew="content"' > newfile.yml` to create a new file.
See [tips and tricks](https://mikefarah.gitbook.io/yq/usage/tips-and-tricks) for more common problems and solutions.