add jtq: a convenience wrapper script - json2tsv - JSON to TSV converter
 (HTM) git clone git://git.codemadness.org/json2tsv
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 607615a6d80ffa57f81aca02f77ae94960828d63
 (DIR) parent e2eeb2664324786e1a51e0ce64dbe03eeeff8346
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Tue, 30 Aug 2022 20:20:38 +0200
       
       add jtq: a convenience wrapper script
       
       It wraps json2tsv, sets options for handling JSON data in a lossless manner and
       uses awk as a "query language".
       
       Diffstat:
         M Makefile                            |      16 +++++++++-------
         M json2tsv.1                          |       4 ++--
         A jtq                                 |      31 +++++++++++++++++++++++++++++++
         A jtq.1                               |      46 +++++++++++++++++++++++++++++++
       
       4 files changed, 88 insertions(+), 9 deletions(-)
       ---
 (DIR) diff --git a/Makefile b/Makefile
       @@ -19,9 +19,11 @@ JSON2TSV_CPPFLAGS = -D_DEFAULT_SOURCE
        #JSON2TSV_CPPFLAGS = -D_DEFAULT_SOURCE -DGETNEXT=getchar
        
        BIN = ${NAME}
       +SCRIPTS = jtq
        SRC = ${BIN:=.c}
        HDR = json.h
       -MAN1 = ${BIN:=.1}
       +MAN1 = ${BIN:=.1}\
       +        ${SCRIPTS:=.1}
        DOC = \
                LICENSE\
                README
       @@ -53,7 +55,7 @@ ${LIBJSON}: ${LIBJSONOBJ}
        dist:
                rm -rf "${NAME}-${VERSION}"
                mkdir -p "${NAME}-${VERSION}"
       -        cp -f ${MAN1} ${DOC} ${HDR} \
       +        cp -f ${MAN1} ${DOC} ${HDR} ${SCRIPTS} \
                        ${SRC} ${LIBJSONSRC} Makefile "${NAME}-${VERSION}"
                # make tarball
                tar cf - "${NAME}-${VERSION}" | gzip -c > "${NAME}-${VERSION}.tar.gz"
       @@ -63,10 +65,10 @@ clean:
                rm -f ${BIN} ${OBJ} ${LIB}
        
        install: all
       -        # installing executable files.
       +        # installing executable files and scripts.
                mkdir -p "${DESTDIR}${PREFIX}/bin"
       -        cp -f ${BIN} "${DESTDIR}${PREFIX}/bin"
       -        for f in ${BIN}; do chmod 755 "${DESTDIR}${PREFIX}/bin/$$f"; done
       +        cp -f ${BIN} ${SCRIPTS} "${DESTDIR}${PREFIX}/bin"
       +        for f in ${BIN} ${SCRIPTS}; do chmod 755 "${DESTDIR}${PREFIX}/bin/$$f"; done
                # installing example files.
                mkdir -p "${DESTDIR}${DOCPREFIX}"
                cp -f ${DOC} "${DESTDIR}${DOCPREFIX}"
       @@ -77,8 +79,8 @@ install: all
                for m in ${MAN1}; do chmod 644 "${DESTDIR}${MANPREFIX}/man1/$$m"; done
        
        uninstall:
       -        # removing executable files.
       -        for f in ${BIN}; do rm -f "${DESTDIR}${PREFIX}/bin/$$f"; done
       +        # removing executable files and scripts.
       +        for f in ${BIN} ${SCRIPTS}; do rm -f "${DESTDIR}${PREFIX}/bin/$$f"; done
                # removing example files.
                for d in ${DOC}; do rm -f "${DESTDIR}${DOCPREFIX}/$$d"; done
                -rmdir "${DESTDIR}${DOCPREFIX}"
 (DIR) diff --git a/json2tsv.1 b/json2tsv.1
       @@ -1,4 +1,4 @@
       -.Dd May 2, 2022
       +.Dd August 30, 2022
        .Dt JSON2TSV 1
        .Os
        .Sh NAME
       @@ -130,7 +130,7 @@ json2tsv -r -F '\ex1f' -R '\ex1e' < input.json | \e
        .Ed
        .Sh SEE ALSO
        .Xr awk 1 ,
       -.Xr grep 1
       +.Xr jtq 1
        .Sh AUTHORS
        .An Hiltjo Posthuma Aq Mt hiltjo@codemadness.org
        .Sh CAVEATS
 (DIR) diff --git a/jtq b/jtq
       @@ -0,0 +1,31 @@
       +#!/bin/sh
       +args=$(getopt n $*)
       +if [ $? -ne 0 ]; then
       +        echo "usage: $0 [-n] [awk expressions...]" >&2
       +        exit 1
       +fi
       +
       +nflag=""
       +set -- $args
       +while [ $# -ne 0 ]; do
       +        case "$1" in
       +        -n)
       +                nflag="-n"; shift;; # json2tsv -n: show indices for array types.
       +        --)
       +                shift; break;;
       +        esac
       +done
       +
       +e="$@" # awk expressions
       +if [ $# -gt 0 ]; then
       +        statusfile=$(mktemp)
       +        # simulate pipefail if JSON data is invalid.
       +        { json2tsv ${nflag} -r -F '\x1f' -R '\x1e'; echo $? >"${statusfile}"; } | \
       +                LC_ALL=C awk "BEGIN { FS = \"\x1f\"; RS = \"\x1e\"; }${e}"
       +        statuscode="$(cat "${statusfile}")$?"
       +        rm -f "${statusfile}"
       +        test "${statuscode}" = "00"
       +else
       +        # show the nodes per line.
       +        json2tsv ${nflag}
       +fi
 (DIR) diff --git a/jtq.1 b/jtq.1
       @@ -0,0 +1,46 @@
       +.Dd August 30, 2022
       +.Dt JTQ 1
       +.Os
       +.Sh NAME
       +.Nm jtq
       +.Nd json2tsv convenience wrapper script using awk as a query language
       +.Sh SYNOPSIS
       +.Nm
       +.Op Fl n
       +.Op Ar awk expressions...
       +.Sh DESCRIPTION
       +.Nm
       +reads JSON data from stdin.
       +When any
       +.Ar awk expressions
       +are given then the
       +.Xr json2tsv 1
       +options
       +.Fl r
       +and
       +.Fl F Ar '\ex1f'
       +and
       +.Fl R Ar '\ex1e'
       +are passed also.
       +If there are no
       +.Ar awk expressions
       +given then it passes the input to
       +.Xr json2tsv 1 .
       +.Pp
       +The options are as follows:
       +.Bl -tag -width Ds
       +.It Fl n
       +Show the indices for array types (by default off).
       +.El
       +.Sh EXIT STATUS
       +.Ex -std
       +.Sh EXAMPLES
       +.Bd -literal
       +echo '{"url":"https://codemadness.org/"}' | \e
       +        jtq '$1 == ".url" { print $3 }'
       +.Ed
       +.Sh SEE ALSO
       +.Xr awk 1 ,
       +.Xr json2tsv 1
       +.Sh AUTHORS
       +.An Hiltjo Posthuma Aq Mt hiltjo@codemadness.org