Browse Source

bin: add `pcat` - debug useful pipe filter/highlighter

Signed-off-by: Alejandro Mery <amery@geeks.cl>
master
Alejandro Mery 4 years ago
parent
commit
30522b48c2
1 changed files with 166 additions and 0 deletions
  1. +166
    -0
      files/bin/pcat

+ 166
- 0
files/bin/pcat

@ -0,0 +1,166 @@
#!/bin/sh
set -eu
# variables
#
FROM=
UNTIL=
SED_ARGS=
GREP_ARGS=
# bin helpers
#
if STDBUF=$(which stdbuf); then
STDBUF="$STDBUF -i0 -o0"
fi
if [ -n "$(sed 2>&1 | grep -- -u,)" ]; then
SED="sed -u"
else
SED="${STDBUF:+$STDBUF }sed"
fi
GREP="${STDBUF:+$STDBUF }sed"
# Colours
#
NORMAL="$(printf '\x1b[39;49m')"
COLOUR="$NORMAL"
RED="$(printf '\x1b[31m')"
GREEN="$(printf '\x1b[32m')"
YELLOW="$(printf '\x1b[33m')"
BLUE="$(printf '\x1b[34m')"
MAGENTA="$(printf '\x1b[35m')"
CYAN="$(printf '\x1b[36m')"
# shell helpers
#
die() {
local arg0="$(basename "$0")"
if [ $# -eq 0 ]; then
sed -e "s!^!$arg0 :"
else
echo "$arg0: $@"
fi >&2
exit 1
}
# arguments
#
while [ $# -gt 0 ]; do
case "${1:-}" in
-f)
# prefilter from
FROM="$2"
shift
;;
-u)
# prefilter until
UNTIL="$2"
shift
;;
-e)
# highlight pattern
#
if [ "$COLOUR" = "$RED" ]; then
COLOUR="$GREEN"
elif [ "$COLOUR" = "$GREEN" ]; then
COLOUR="$MAGENTA"
elif [ "$COLOUR" = "$MAGENTA" ]; then
COLOUR="$YELLOW"
elif [ "$COLOUR" = "$YELLOW" ]; then
COLOUR="$CYAN"
elif [ "$COLOUR" = "$CYAN" ]; then
COLOUR="$BLUE"
else
COLOUR="$RED"
fi
case "$2" in
"^"*"$") PATTERN="$2" ;;
"^"*) PATTERN="$2.*" ;;
*"$") PATTERN=".*$2" ;;
*) PATTERN=".*$2.*"
esac
SED_ARGS="${SED_ARGS:+$SED_ARGS }-e 's!$PATTERN!$COLOUR\0$NORMAL!g'"
shift
;;
# grep -i
-i)
GREP_ARGS="${GREP_ARGS:+$GREP_ARGS }$1"
;;
# simple grep options with arguments
-C|-A|-B)
GREP_ARGS="${GREP_ARGS:+$GREP_ARGS }$1 $2"
shift
;;
# grep options with merged arguments
-C*|-A*|-B*)
GREP_ARGS="${GREP_ARGS:+$GREP_ARGS }'$1'"
;;
# complex grep options with arguments
-E)
GREP_ARGS="${GREP_ARGS:+$GREP_ARGS }$1 '$2'"
shift
;;
# -g is `grep -e`
-g)
GREP_ARGS="${GREP_ARGS:+$GREP_ARGS }-e '$2'"
shift
;;
# simple grep options without arguments
-v)
GREP_ARGS="${GREP_ARGS:+$GREP_ARGS }$1"
;;
--) shift
break
;;
# any other option
-*)
die "$1 unsupported"
;;
# straight arguments
*)
break
;;
esac
shift
done
#
# compose pipeline
#
# CMD
PIPELINE="$*"
# FROM/UNTIL FILTER
if [ -n "${FROM:-}${UNTIL:-}" ]; then
PIPELINE="${PIPELINE:+$PIPELINE | }$SED"
[ -z "${FROM:-}" ] || PIPELINE="$PIPELINE -e '0,/$FROM/d'"
[ -z "${UNTIL:-}" ] || PIPELINE="$PIPELINE -e '/$UNTIL/,\$d'"
fi
# GREP FILTER
if [ -n "${GREP_ARGS:-}" ]; then
PIPELINE="${PIPELINE:+$PIPELINE | }$GREP -a $GREP_ARGS"
fi
# HIGHLIGHT
if [ -n "${SED_ARGS:-}" ]; then
PIPELINE="${PIPELINE:+$PIPELINE | }$SED $SED_ARGS"
fi
#and run
eval "${PIPELINE:-cat}"

Loading…
Cancel
Save