cli-tools
📋 Copy All yq Commands
📄 Generate yq PDF Guide
yq Cheatsheet - YAML/JSON/XML Prozessor
Installation
Plattform
Befehl
Ubuntu/Debian
wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/local/bin/yq && chmod +x /usr/local/bin/yq
Ubuntu (PPA)
sudo add-apt-repository ppa:rmescandon/yq && sudo apt update && sudo apt install yq
macOS (Homebrew)
brew install yq
macOS (MacPorts)
sudo port install yq
Windows (Chocolatey)
choco install yq
Windows (Scoop)
scoop install yq
Snap
snap install yq
Go
go install github.com/mikefarah/yq/v4@latest
Docker
docker run --rm -v "${PWD}":/workdir mikefarah/yq
Alpine Linux
apk add yq
Arch Linux
yay -S yq
Verify Installation
yq --version
Grundlegende Befehle - Lesen & Anzeigen
Befehl
Beschreibung
yq '.' file.yaml
Gesamte YAML-Datei anzeigen (Pretty Print)
yq '.name' file.yaml
Lesen Sie einen bestimmten Feldwert
yq '.metadata.name' file.yaml
Verschachteltes Feld mit Punktnotation lesen
yq '.items[0]' file.yaml
Ersten Elementes eines Arrays zugreifen
yq '.items[*]' file.yaml
Greife auf alle Elemente eines Arrays zu
yq '.items[]' file.yaml
Iteriere durch Array-Elemente
yq '.items[].name' file.yaml
Extrahiere spezifisches Feld aus allen Array-Elementen
yq '.items[-1]' file.yaml
Letztes Element eines Arrays aufrufen
yq '.items[1:3]' file.yaml
Array Slice (Elemente 1 und 2)
cat file.yaml \ | yq '.spec'
Von stdin lesen
yq -r '.name' file.yaml
Gib Rohstring aus (ohne Anführungszeichen)
yq '.items \ | length' file.yaml
Länge des Arrays oder Objekts abrufen
yq 'keys' file.yaml
Alle Top-Level-Schlüssel auflisten
yq '.[] \ | keys' file.yaml
Listenkeys von verschachtelten Objekten
Grundlegende Befehle - Schreiben & Aktualisieren
Befehl
Beschreibung
yq '.name = "new-value"' file.yaml
Ein Feld aktualisieren (gibt an stdout aus)
yq -i '.name = "new-value"' file.yaml
Feld direkt aktualisieren (modifiziert Datei)
yq '.spec.replicas = 3' file.yaml
Geschachtelte Werte aktualisieren
yq '.items[0].name = "updated"' file.yaml
Array-Element aktualisieren
yq '.newField = "value"' file.yaml
Neues Feld erstellen
yq '.metadata.labels.env = "prod"' file.yaml
Verschachtelte Felder erstellen
yq 'del(.fieldName)' file.yaml
Ein Feld löschen
yq 'del(.metadata.annotations)' file.yaml
Geschachtelte Felder löschen
yq 'del(.items[0])' file.yaml
Array-Element löschen
yq '.items += {"name": "new"}' file.yaml
An Array anhängen
yq '.items = []' file.yaml
Array leeren
yq '.count += 1' file.yaml
Numerischen Wert erhöhen
yq '.total = .price * .quantity' file.yaml
Arithmetische Operationen
Erweiterte Nutzung - Filtern & Auswählen
Befehl
Beschreibung
yq '.items[] \ | select(.kind == "Pod")' file.yaml
Elemente nach Bedingung filtern
yq '.items[] \ | select(.kind == "Pod" and .status == "Running")' file.yaml
Mehrere Bedingungen (AND)
yq '.items[] \ | select(.kind == "Pod" or .kind == "Service")' file.yaml
Mehrere Bedingungen (ODER)
yq '.items[] \ | select(.name \ | test("^prod-"))' file.yaml
Musterabgleich mit regex
yq '.items[] \ | select(has("metadata"))' file.yaml
Überprüfe, ob Feld existiert
yq '.items[] \ | select(.replicas > 3)' file.yaml
Numerischer Vergleich
yq '.items[] \ | select(.tags \ | contains(["prod"]))' file.yaml
Array enthält Prüfung
yq '.items[] \ | select(.name != null)' file.yaml
Null-Werte herausfiltern
yq '.[] \ | select(tag == "!!str")' file.yaml
Nach YAML-Tag-Typ filtern
Erweiterte Nutzung - Array-Operationen
Befehl
Beschreibung
yq '.items \ | = sort_by(.name)' file.yaml
Array nach Feld sortieren
yq '.items \ | = sort_by(.metadata.creationTimestamp)' file.yaml
Nach verschachteltem Feld sortieren
yq '.items \ | = reverse' file.yaml
Array-Reihenfolge umkehren
yq '.tags \ | unique' file.yaml
Eindeutige Array-Werte abrufen
yq '.items \ | flatten' file.yaml
Verschachtelte Arrays abflachen
yq '.items \ | group_by(.kind)' file.yaml
Gruppiere Array-Elemente
yq '.items \ | map(.name)' file.yaml
Array auf Werte abbilden
yq '.items \ | map(select(.active))' file.yaml
Filter und Map kombiniert
yq '.items = .items + .newItems' file.yaml
Arrays verketten
yq '.items \ | = unique_by(.name)' file.yaml
Duplikate nach Feld entfernen
yq '[.items[].name]' file.yaml
Werte in neues Array sammeln
Erweiterte Nutzung - Zusammenführen & Kombinieren
Befehl
Beschreibung
yq ea 'select(fi == 0) * select(fi == 1)' f1.yaml f2.yaml
Tiefes Zusammenführen von zwei Dateien (f2 überschreibt f1)
yq ea '. as $item ireduce ({}; . * $item)' *.yaml
Mehrere Dateien zusammenführen
yq ea 'select(fi == 0) *+ select(fi == 1)' f1.yaml f2.yaml
Mit Array-Verkettung zusammenführen
yq ea '[.]' file1.yaml file2.yaml
Dateien in Array kombinieren
yq '.config = load("config.yaml")' file.yaml
Externe Datei laden und zusammenführen
yq '.spec.template = load("template.yaml").spec' file.yaml
Spezifischen Pfad aus Datei laden
yq ea 'select(fi == 0) *d select(fi == 1)' f1.yaml f2.yaml
Tiefes Zusammenführen mit Löschung
Erweiterte Nutzung - Zeichenkettenoperationen
Befehl
Beschreibung
yq '.fullName = .firstName + " " + .lastName' file.yaml
String-Verkettung
yq '.name \ | = upcase' file.yaml
In Großbuchstaben umwandeln
yq '.name \ | = downcase' file.yaml
In Kleinbuchstaben umwandeln
yq '.name \ | = trim' file.yaml
Leerzeichen entfernen
yq '.text \ | = sub("old", "new")' file.yaml
Ersetze erste Vorkommen
yq '.text \ | = gsub("old", "new")' file.yaml
Ersetze alle Vorkommen
yq '.path \ | split("/")' file.yaml
String in Array aufteilen
yq '.tags \ | join(", ")' file.yaml
Array in String umwandeln
yq '.name \ | length' file.yaml
Stringlänge
yq '.text \ | contains("substring")' file.yaml
Prüfe, ob String Teilstring enthält
Befehl
Beschreibung
yq -o=json '.' file.yaml
YAML in JSON umwandeln
yq -P '.' file.json
JSON in YAML umwandeln
yq -o=xml '.' file.yaml
YAML zu XML konvertieren
yq -p=xml '.' file.xml
XML in YAML umwandeln
yq -o=csv '.items[]' file.yaml
YAML zu CSV konvertieren
yq -o=props '.' file.yaml
YAML in Properties-Format konvertieren
yq -o=json -I=4 '.' file.yaml
JSON mit benutzerdefinierter Einrückung
yq -o=yaml --yaml-output-version=1.1 '.' file.yaml
YAML-Version angeben
yq -p=csv -o=json '.' file.csv
CSV zu JSON über YAML konvertieren
Konfiguration
Befehlszeilenoptionen
# Input/Output format options
-p, --input-format string Input format ( yaml/json/xml/csv/props)
-o, --output-format string Output format ( yaml/json/xml/csv/props)
-P, --prettyPrint Pretty print ( shorthand for -o= yaml)
# Modification options
-i, --inplace Edit file in place
-I, --indent int Indentation ( default 2 )
# Processing options
-e, --exit-status Exit with status code based on result
-n, --null-input Don' t read input, start with null
-N, --no-colors Disable colored output
-C, --colors Force colored output
# Multiple file options
ea, eval-all Evaluate all files together
Ausdruckssyntax
# Basic path expressions
.field # Access field
.nested.field # Nested access
.[0] # Array index
.[] # Array iteration
.* # All fields
# Operators
= # Assignment
| = # Update assignment
+= # Append/increment
* # Multiply/merge
+ # Add/concatenate
- # Subtract
// # Alternative operator (default value)
# Functions
select() # Filter
map() # Transform array
has() # Check existence
keys # Get keys
length # Get length
sort_by() # Sort array
group_by() # Group array
unique # Remove duplicates
Umgebungsvariablen
# Use environment variables in expressions
export APP_NAME = "my-app"
yq '.name = env(APP_NAME)' file.yaml
# With default value
yq '.name = (env(NAME) // "default")' file.yaml
# String interpolation
yq '.message = "Hello " + env(USER)' file.yaml
Häufige Anwendungsfälle
Anwendungsfall 1: Kubernetes Deployment-Replikate aktualisieren
# Single deployment
yq -i '.spec.replicas = 5' deployment.yaml
# Multiple deployments in one file
yq -i '(.spec.replicas | select(. != null)) = 5' deployments.yaml
# Conditionally update specific deployment
yq -i '(select(.metadata.name == "api-server") | .spec.replicas) = 10' deployment.yaml
# Update all deployments in multiple files
yq -i '.spec.replicas = 3' k8s/*.yaml
Anwendungsfall 2: Konfigurationsdateien zusammenführen
# Merge base config with environment-specific overrides
yq ea 'select(fi == 0) * select(fi == 1)' base-config.yaml prod-config.yaml > final-config.yaml
# Merge multiple environment files
yq ea '. as $item ireduce ({}; . * $item)' base.yaml dev.yaml local.yaml > merged.yaml
# Merge with array concatenation
yq ea 'select(fi == 0) *+ select(fi == 1)' config1.yaml config2.yaml > combined.yaml
# Extract all container images from Kubernetes manifests
yq '.spec.template.spec.containers[].image' deployment.yaml
# Get all service names and ports
yq '.items[] | select(.kind == "Service") | .metadata.name + ":" + (.spec.ports[0].port | tostring)' services.yaml
# Create summary report
yq '.items[] | {"name": .metadata.name, "kind": .kind, "namespace": .metadata.namespace}' resources.yaml -o= json
Anwendungsfall 4: Massenaktualisierungen über mehrere Dateien
# Add label to all resources
find . -name "*.yaml" -exec yq -i '.metadata.labels.environment = "production"' {} \;
# Update image tag in all deployments
yq -i '(.spec.template.spec.containers[].image | select(. == "*:latest")) |= sub(":latest", ":v1.2.3")' k8s/**/*.yaml
# Add annotation to specific resources
yq -i 'select(.kind == "Service") | .metadata.annotations."prometheus.io/scrape" = "true"' *.yaml
Anwendungsfall 5: CI/CD Pipeline-Konfiguration
# Update version in multiple config files
export VERSION = "2.1.0"
yq -i '.version = env(VERSION)' chart/Chart.yaml
yq -i '.image.tag = env(VERSION)' values.yaml
# Inject secrets from environment
yq -i '.database.password = env(DB_PASSWORD)' config.yaml
# Generate environment-specific configs
for env in dev staging prod; do
yq ea 'select(fi == 0) * select(fi == 1)' base.yaml "env- ${ env } .yaml" > "config- ${ env } .yaml"
done
Bewährte Praktiken
Immer zuerst ohne -itesten : Befehle ohne In-Place-Flag ausführen, um Änderungen zu previwen, bevor Dateien modifiziert werden
yq '.spec.replicas = 5' deployment.yaml # Preview first
yq -i '.spec.replicas = 5' deployment.yaml # Then apply
```
- **Versionskontrolle verwenden**: Dateien vor Massänderungen committen, um bei Bedarf einfach zurückzukehren
- **Ausdrücke in Anführungszeichen**: Einzelne Anführungszeichen für Ausdrücke verwenden, um Shell-Interpretation zu verhindern``` bash
yq '.items[] | select(.name == "test")' file.yaml # Correct
```
- **YAML nach Änderungen validieren**: Stellen Sie sicher, dass Ihre Änderungen gültiges YAML erzeugen
``` bash
yq '.' modified.yaml > /dev/null && echo "Valid YAML" || echo "Invalid YAML"
```
( No complete text)
` select () `
- **Kommentare beibehalten**: yq bewahrt Kommentare standardmäßig auf, aber seien Sie vorsichtig bei komplexen Transformationen
``` bash
yq '(select(.kind == "Deployment") | .spec.replicas) = 3' file.yaml
```
- **Umgebungsvariablen nutzen**: Halten Sie sensible Daten aus Skripten heraus
` eval-all`
( No complete text)
``` bash
yq ea '. as $item ireduce ({}; . * $item)' *.yaml
```
( No complete text)
``` bash
export SECRET_KEY = "..."
yq '.apiKey = env(SECRET_KEY)' config.yaml
```
## Fehlerbehebung
Would you like to provide the complete texts so I can translate them fully?` -r` flag when piping to other commands
``` bash
IMAGE = $( yq -r '.spec.template.spec.containers[0].image' deployment.yaml)
```
- **Check exit codes for validation**: Use ` -e` flag to fail on null/false results
``` bash
yq -e '.spec.replicas > 0' deployment.yaml && echo "Valid" || echo "Invalid"
```
## Troubleshooting
| Problem | Lösung |
| -------| ----------|
| **Error: "bad file descriptor" ** | Use ` -i` flag correctly or redirect output: ` yq '.' file.yaml > temp && mv temp file.yaml` |
| **Changes not persisted** | Add ` -i` flag for in -place editing: ` yq -i '.field = "value"' file.yaml` |
| **"null" appears in output** | Field doesn't exist or is null. Use alternative operator: `yq ' .field // "default" ' file.yaml` |
| **Comments are removed** | Use `... comments=""` to explicitly remove, or check if using operations that don' t preserve comments |
| **Array merge replaces instead of concatenates** | Use ` *+` instead of ` *` for merge: ` yq ea 'select(fi==0) *+ select(fi==1)' f1.yaml f2.yaml` |
| **"Error: bad expression" ** | Überprüfe Ausdruckssyntax, stelle korrekte Anführungszeichen sicher, verifiziere Operatoren |
| **Output has extra quotes** | Use ` -r` flag for raw output: ` yq -r '.name' file.yaml` |
| **Cannot process multiple files** | Use ` ea` ( eval-all) command: ` yq ea '.' file1.yaml file2.yaml` |
| **Wrong version of yq** | Verify you have mikefarah/yq ( not kislyuk/yq) : ` yq --version` should show github.com/mikefarah/yq |
| **Permission denied on ` -i` ** | Ensure write permissions: ` chmod u+w file.yaml` or run with appropriate privileges |
| **Encoding issues with special characters** | Ensure UTF-8 encoding: ` yq --encoding= utf-8 '.' file.yaml` |
| **Large files cause memory issues** | Process in chunks or use streaming: ` yq -N '.items[]' large-file.yaml` |
| **Path not found errors** | Verify path exists: ` yq 'has("path.to.field")' file.yaml` before accessing |
| **Merge conflicts with complex structures** | Use explicit merge strategies: ` *d` for deep merge with deletion, ` *+` for array concatenation |
## Quick Reference - Common Patterns
``` bash
# Read value
yq '.path.to.field' file.yaml
# Update value
yq -i '.path.to.field = "new-value"' file.yaml
# Delete field
yq -i 'del(.path.to.field)' file.yaml
# Filter array
yq '.items[] | select(.name == "target")' file.yaml
# Merge files
yq ea 'select(fi==0) * select(fi==1)' base.yaml override.yaml
# Convert format
yq -o= json '.' file.yaml
# Use environment variable
yq '.field = env(VAR_NAME)' file.yaml
# Multiple operations
yq -i '.field1 = "value1" | .field2 = "value2"' file.yaml