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 を組み込むのもアリかもしれない。