2020年12月8日火曜日

jq で標準エラーをパイプする方法

概要

標準エラーは基本的にパイプできないので標準入力にリダイレクトしてあげましょう

環境

  • macOS 10.15.7
  • jq 1.5

動作する

  • echo '{"key":"value"}' | jq .

動作しない

  • ruby -e "STDERR.puts '{\"key\":\"value\"}'" | jq .

対処する

  • ruby -e "STDERR.puts '{\"key\":\"value\"}'" 2>&1 | jq .

2>&1 で標準エラーを標準リクエストにリダイレクトできます

おまけ: 標準エラーの tail -f を jq する場合は

  • ruby hoge.rb 2>&1 | while read line; do echo $line | jq -R '. as $line | try fromjson catch "not json"'; done

-R は入力された情報をパースせずにそのまま使用するオプションです
ダブルクォートなどが削除されません
as 変数格納で . で受け取った情報を $line という変数に格納して次のパイプで参照できるようにします
あとは try .. catch で受け取った $line を評価します
JSON ではない場合は「not json」が表示されます

テストスクリプトは以下です

loop do
  STDERR.puts '{"key":"value"}'
  STDERR.puts 'hoge'
  sleep(1)
end

参考サイト

0 件のコメント:

コメントを投稿