Node.js をシェルのパイプ中で使ってみる

Perl や Ruby だと、よくシェルの中でワンライナーを書いて実行していたりする。それを Node.js でもやってみようという試み。

目次

Node.js をシェル中で使う基本

Node.js をシェルの中で使うには、$ node -e '【コード】' という風に実行する。

手前のコマンドの結果をパイプで受け取って処理するには、次のようなコードを書けば良い。

$ echo 'HOGE' | node -e 'console.log( require("fs").readFileSync("/dev/stdin", "utf-8") );'

// → HOGE

require("fs").readFileSync("/dev/stdin", "utf-8") で標準入力をまるっと受け取れる。

何かを出力したければ console.log() を書けば良い。

サンプルコード

それでは試しにサンプルコード。カンマ区切りの文字列を、コロン区切りに変更して出力する。

$ echo 'HOGE,FUGA,FOO,BAR' | node -e 'const input = require("fs").readFileSync("/dev/stdin", "utf-8"); const result = input.split(",").join(":"); console.log(result);'

// → HOGE:FUGA:FOO:BAR

次は JSON 文字列の操作。JSON.parse() した後は好きにイジれる。

$ echo '{ "HOGE": "fuga", "FOO": "bar" }' | node -e 'const input = require("fs").readFileSync("/dev/stdin", "utf-8"); const parsed = JSON.parse(input); console.log(Object.values(parsed));'

// → [ 'fuga', 'bar' ]

一度 JSON 文字列を Node.js に取り込んだら、この中で何でもやればいいと思うが、もしその後に jq に渡したい、という場合は、Node.js が出力する文字列は JSON.stringiy() しておかないといけない (上の例で出力しているのは、シングルクォートを使っていて「JavaScript の配列」とみなされるので、JSON としては構文エラーになる)。

$ echo '{ "HOGE": "fuga", "FOO": "bar" }' | node -e 'const input = require("fs").readFileSync("/dev/stdin", "utf-8"); const parsed = JSON.parse(input); console.log(JSON.stringify(Object.values(parsed)));' | jq -r '.[1]'

// → bar

こんな感じ。

Perl や Ruby のワンライナーが苦手で、JavaScript ならチョットデキルという人なら、このようにシェル中に Node.js を組み込むのもアリかもしれない。