Découvrez comment utiliser efficacement fx, un outil de ligne de commande de manipulation JSON

fx est un outil de ligne de commande de manipulation JSON populaire. Il peut être installé via npm, brasser ou téléchargé en tant que fichier binaire autonome.

npm i -g fx

fx est pratique avec une commande curl. Si vous avez une API qui retourne JSON et que vous voulez creuser dans la structure ou simplement la voir, dirigez JSON dans fx.

curl https://swapi.co/api/planets/ | fx

fx a un mode interactif très soigné pour creuser en JSON.

Vous pouvez utiliser votre souris ou les touches de direction pour naviguer dans JSON. FX prend en charge les plis, cliquez sur un fichier pour le développer ou appuyez sur la flèche droite pour le développer. Appuyez sur la touche e pour développer tous les champs de manière récursive. Appuyez sur Maj + e pour tout réduire.

Pelle interactive

En mode interactif, appuyez sur. touche (point). Vous verrez un curseur à la fin de la fenêtre de votre terminal avec une liste de champs JSON. Utilisez les touches fléchées pour choisir un champ et appuyez sur entrée, continuez jusqu'à ce que vous trouviez les données nécessaires. Si vous devez revenir en arrière d’un niveau, appuyez sur Ctrl + w pour effacer le dernier segment du chemin. Cette commande supprime avec précision la dernière partie à côté de. ou [parenthèse. Si vous voulez recommencer, appuyez sur Ctrl + u.

En passant, dans ce champ, vous pouvez écrire n’importe quelle expression JavaScript, pas seulement les expressions de chemin.

Jolie impression

Parfois, vous n’avez pas besoin de la pelle interactive et souhaitez imprimer du JSON sur stdout. Cela peut être fait en ajoutant. argument à la commande fx.

curl https://swapi.co/api/planets/1/ | fx.

Ou pour imprimer uniquement une partie de JSON, spécifiez le chemin souhaité.

curl https://swapi.co/api/planets/1/ | fx .films

Demander une API à chaque fois prend beaucoup de temps. Et si on la sauvegardait d'abord sur un disque?

curl https://swapi.co/api/planets/1/> data.json

Nous pouvons maintenant passer le fichier en tant que premier argument de fx.

fx data.json .films

Chaque argument de fx peut être une fonction JavaScript. Créons le fichier .fxrc. Nous y mettons une fonction utile et des extraits à réutiliser.

Extraits

Ajoutons la puissance de lodash à notre ligne de commande. Installez lodash globalement.

npm i -g lodash

Créez un fichier .fxrc dans votre répertoire personnel. Et mettez la ligne suivante dedans.

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

Vous pourrez désormais appeler toutes les méthodes lodash sans utiliser le préfixe _. Par exemple, voyez qui s’est engagé à réagir récemment:

curl 'https://api.github.com/repos/facebook/react/commits' \
| fx 'groupBy ("commit.author.name")' 'mapValues ​​(size)' \
      toPairs 'sortPar (1)' inverse 'prend (10)' dePaires

Comptons l’utilisation de différents mots dans les messages de validation.

curl 'https://api.github.com/repos/facebook/react/commits' \
| fx 'map ("commit.message")' 'map (words)' aplatit \
     'map (lowerCase)' 'groupBy (identity)' 'mapValues ​​(size)' \
      toPairs 'sortPar (1)' inverse 'prend (30)' dePaires

Ajouter vos propres extraits

C'est assez facile aussi. Par exemple, j'ai une API qui nécessite que les documents soient codés en base64. Voyons comment cela peut être fait.

Créer une fonction et assigner à global. Par exemple, un extrait de base64.

global.base64 = str => Buffer.from (str) .toString ('base64')

Maintenant, je suis capable de faire quelque chose comme ça:

fx data.json '{valeur: base64 (JSON.stringify (this))}}' | curl -X POST

Ou si divisé pour séparer des fonctions:

fx data.json JSON.stringify base64 '{valeur: this}' | curl -X POST

Modifier sur place

Avec fx, vous pouvez facilement modifier les objets JSON en utilisant ... l'opérateur spread.

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

Mais si vous essayez de modifier un fichier et de l'enregistrer sur un disque en une seule commande, vous corrompez votre fichier.

fx data.json '{... this, count: this.count + 1}'> data.json

Ceci est commun à toutes les lignes de commande. Par exemple, sed a un drapeau spécial pour éditer in-sed sed -i. Ajoutons cette fonctionnalité également.

global.save = json => (require ('fs'). writeFileSync (process.argv [2], JSON.stringify (json, null, 2)), json)

Et maintenant, nous pouvons simplement appeler save:

fx data.json '{... this, count: 1}' save

Nous pouvons même sortir le champ modifié en enregistrant sur le disque.

fx data.json '{... this, count: this.count + 1}' save .count

Utiliser xargs

fx imprime les chaînes dans stdout sous forme de chaînes «brutes» sans guillemets, ce qui peut s'avérer utile pour faire en sorte que les filtres fx parlent à des systèmes autres que JSON. Mais si on veut passer une liste d'arguments? Le prochain extrait est pratique.

global.list = json => (json.forEach (x => console.log (x)), non défini)

Par défaut, les caractères non définis sont imprimés dans stderr, ce qui n’affectera pas nos tubes.

curl https://swapi.co/api/planets/1/ | fx .films list | xargs curl

Recherche JSON

fx prend en charge la recherche JSON interactive. Appuyez sur / pour taper votre motif à rechercher.

Pour passer à la correspondance de motif suivante, appuyez sur n. Vous pouvez appliquer un filtre avec. ainsi que. FX fonctionne très bien avec les deux simultanément.

Mais si nous voulons quelque chose de différent?

Je pense que JavaScript est le meilleur langage pour travailler avec JSON (acronyme de JavaScript Object Notation). En quoi voulons-nous trouver toutes les occurrences d’un motif et l’imprimer sur stdout? Nous pouvons créer notre propre extrait de recherche. Alors, créons un extrait de recherche!

Maintenant nous pouvons rechercher récursivement notre JSON!

fx data.json 'find (/ fix / i)'

Et encore mieux, avec l’utilisation de la liste de fragments précédente, vous pouvez imprimer des pièces créées.

fx data.json 'find (/ fix / i)' list | xargs -L1 fx data.json

Diffusion

FX prend également en charge le streaming JSON. Vous pouvez l'utiliser pour analyser les journaux, etc.

bûches kubectl ... | message fx

Sélectionnez (ou filtrez) uniquement les messages souhaités en ajoutant au préalable un assistant de sélection.

bûches kubectl ... | fx 'select (x => x.level == "info")' .message

Ou simplement concaténer quelques fichiers JSON avec cat et pipe to fx.

chat * .json | fx .length

Support des thèmes

FX prend également en charge les thèmes. Vous pouvez changer les couleurs et le retrait.

global.FX_STYLE_SPACE = 4

Deux thèmes géniaux pour FX sont ci-dessous:

  • fx-theme-monokai - thème monokai
  • fx-theme-night - thème de la nuit

J'espère que vous apprécierez l'utilisation de FX!

Si vous aimez ce que je fais, pensez à me soutenir sur Patreon.
Et suivez-moi sur GitHub.