pick
Extract values from anything — JSON, YAML, TOML, .env, HTTP headers, logfmt, CSV, and more.
pick auto-detects the input format and lets you extract values using a simple selector syntax. No more juggling jq, yq, grep, awk, and cut for different formats.
Usage
# JSON
|
# octocat
# .env
|
# postgres://localhost:5432/mydb
# YAML
|
# 8080
# TOML
|
# 0.1.0
# HTTP headers
|
# text/html; charset=UTF-8
# logfmt
|
# 200
# CSV
|
# Alice
Selectors
| Syntax | Description |
|---|---|
foo |
Top-level key |
foo.bar |
Nested key |
foo[0] |
Array index |
foo[-1] |
Last element |
foo[*].name |
All elements, pluck field |
[0] |
Index into root array |
"dotted.key".sub |
Quoted key (for keys containing dots) |
Flags
| Flag | Description |
|---|---|
-i, --input <format> |
Force input format (json, yaml, toml, env, headers, logfmt, csv, text) |
-f, --file <path> |
Read from file instead of stdin |
--json |
Output result as JSON |
--raw |
Output without trailing newline |
-1, --first |
Only output first result |
--lines |
Output array elements one per line |
-d, --default <value> |
Default value if selector doesn't match |
-q, --quiet |
Suppress error messages |
-e, --exists |
Check if selector matches (exit code only) |
-c, --count |
Output count of matches |
Examples
Pipe-friendly
# Get the current git user's repos
|
# Check if a key exists before using it
if | ; then
DB_HOST=
fi
# Extract with a fallback
|
# Count results
|
# 5
Format override
# Force YAML parsing on ambiguous input
|
# Parse a file directly
Real-world
# Docker container status
|
# Kubernetes pod IPs
|
# Cargo.toml dependencies
# .env database URL for a script
Supported Formats
| Format | Auto-detected | Example |
|---|---|---|
| JSON | Yes | {"key": "value"} |
| YAML | Yes | key: value |
| TOML | Yes | [section] / key = "value" |
| .env | Yes | KEY=value |
| HTTP headers | Yes | Content-Type: text/html |
| logfmt | Yes | level=info msg="hello" |
| CSV/TSV | Yes | name,age\nAlice,30 |
| Plain text | Fallback | Key-value extraction and substring search |
Auto-detection works in most cases. Use -i to override when the input is ambiguous.
Install
Cargo (Rust)
Homebrew (macOS/Linux)
npm
Snap (Linux)
Chocolatey (Windows)
choco install pick
WinGet (Windows)
winget install aryanbhosale.pick
Docker
|
GitHub Releases
Download pre-built binaries from Releases — macOS (ARM/x64), Linux (x64/ARM64), and Windows (x64).
From source
Requires Rust 1.85+:
Contributing
Contributions are welcome! Here's how to get started:
- Fork the repository
- Create a feature branch:
git checkout -b my-feature - Make your changes
- Run the tests:
cargo test - Commit and push:
git push origin my-feature - Open a pull request
Development
# Run all tests (259 unit + integration)
# Run a specific test
# Build release binary
# The binary will be at target/release/pick
Project Structure
src/
main.rs Entry point, stdin/file reading
lib.rs Orchestration and format routing
cli.rs CLI argument definitions
error.rs Error types
selector.rs Selector parser and extraction engine
detector.rs Format auto-detection heuristics
output.rs Output formatting
formats/ Per-format parsers
json.rs, yaml.rs, toml_format.rs, env.rs,
headers.rs, logfmt.rs, csv_format.rs, text.rs
tests/
integration.rs CLI integration tests
Issues
Found a bug or have a feature request? Open an issue.