課題
以下のような Line Delimited な JSON ログファイルがあったとして、
input.json
{"a":"foo","b":"bar"}
{"a":"foo","b":"bar"}
jq コマンドを以下のように使うと、
$ cat input.json | jq -r '.a,.b'
foo
bar
foo
bar
のように行指向になっていなくて、そのあと awk とか grep とかに pipe でわたしてごにょごにょするのが辛い。
foo bar
foo bar
のように出力して欲しい
やりかた
以下のようにすると TSV に変換できて、行指向になる。
$ cat input.json | jq -r '"\(.a)\t\(.b)"'
foo bar
foo bar
スクリプト
覚えにくくて毎回打ってられない感あるので、ラッパースクリプトを書いた。名前はてきとうに jjq にした。
jjq
#!/bin/bash
usage_exit() {
echo "Usage: $0 [-k keys] [file]" 1>&2
echo "" 1>&2
echo "List specified keys of Line Delimited JSON file" 1>&2
echo "" 1>&2
echo " OPTIONS" 1>&2
echo " -k keys keys to output (multiple keys separated by ,)" 1>&2
echo "" 1>&2
exit 1
}
while getopts k:Kh OPT
do
case $OPT in
k) # Converting like "\(.foo)\t\(.bar)"
KEYS=$(echo $OPTARG | sed 's/,/)\\t\\(./g')
KEYS=$(echo "\"\(.$KEYS)\"")
;;
h) usage_exit
;;
\?) usage_exit
;;
esac
done
shift $((OPTIND - 1))
if [ $# -eq 0 ]; then
exec jq -r "${KEYS}"
else
FILE=${@:$#}
exec jq -r "${KEYS}" $FILE
fi
これで以下のようにできるようになった。
$ cat input.json | jjq -k a,b
おしまい