You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
fx/doc/doc.md

3.7 KiB

Documentation

fx can work in two modes: as reducer or interactive. To start interactive mode pipe any JSON into fx:

$ curl ... | fx

Or you can pass a filename as the first parameter:

$ fx data.json

Reducers

If any additional arguments was passed, fx converts it to a function which takes JSON as argument named x.

By default, fx uses builtin JavaScript VM (goja), but fx also can be used with node, python, or ruby.

JavaScript

FX_LANG=js

An example of anonymous function used as reducer:

$ echo '{"foo": [{"bar": "value"}]}' | fx 'x => x.foo[0].bar'
value

The same reducer function can be simplified to:

$ echo '{"foo": [{"bar": "value"}]}' | fx 'x.foo[0].bar'
value

Each argument treated as a reducer function.

$ echo '{"foo": [{"bar": "value"}]}' | fx 'x.foo' 'x[0]' 'x.bar'
value

Update JSON using the spread operator:

$ echo '{"name": "fx", "count": 0}' | fx '{...this, count: 1}'
{
  "name": "fx",
  "count": 1
}

Dot

Fx supports simple JS-like syntax for accessing data, which can be used with any FX_LANG.

$ echo '{"foo": [{"bar": "value"}]}' | fx .foo[0].bar
value

.fxrc.js

Create .fxrc.js file in $HOME directory, and define some useful functions.

// .fxrc.js
function upper(s) {
  return s.toUpperCase()
}
$ cat data.json | fx .name upper
ANTON

Node

FX_LANG=node

Npm packages

Use any npm package by installing it globally. Create .fxrc.js file in $HOME directory, and require any packages or define global functions.

For example, access all lodash methods without _ prefix.

Put next line your .fxrc.js file:

Object.assign(global, require('lodash/fp'))

And now you will be able to call all lodash methods. For example, see who's been committing to react recently:

curl 'https://api.github.com/repos/facebook/react/commits?per_page=100' \
| fx 'groupBy("commit.author.name")' 'mapValues(size)' toPairs 'sortBy(1)' reverse 'take(10)' fromPairs

To be able to require global modules make sure you have correct NODE_PATH env variable.

export NODE_PATH=`npm root -g`

The .fxrc.js file supports both: import and require.

import 'zx/globals'
const _ = require('lodash')

With you want to use .fxrc.js for both FX_LANG=js and FX_LANG=node, separate parts by // nodejs: comment:

function upper(s) {
  return s.toUpperCase()
}
// nodejs:
import 'zx/globals'
const _ = require('lodash')

Python

FX_LANG=python

Or

FX_LANG=python3

Example:

fx data.json '[x["age"] + i for i in range(10)]'

Ruby

FX_LANG=ruby

Example:

fx data.json 'x.to_a.map {|x| x[1]}'

Streaming mode

fx supports line-delimited JSON streaming and concatenated JSON streaming.

$ kubectl logs ... | fx .message

Interactive mode

Type ? to see full list of available shortcuts while in interactive mode.

Press / and type regexp pattern to search in current JSON. Search is performed on internal representation of the JSON without newlines.

Type n to jump to next result, and N to previous.s

Selecting text

You can't just select text in fx. This is due the fact that all mouse events are redirected to stdin. To be able to select again you need instruct your terminal not to do it. This can be done by holding special keys while selecting:

Key Terminal
Option+Mouse iTerm2, Hyper
Fn+Mouse Terminal.app
Shift+Mouse Linux