You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

188 lines
2.9 KiB

  1. #!/bin/sh
  2. set -eu
  3. # variables
  4. #
  5. FROM=
  6. UNTIL=
  7. SED_ARGS=
  8. GREP_ARGS=
  9. GREPV_ARGS=
  10. # bin helpers
  11. #
  12. if STDBUF=$(which stdbuf); then
  13. STDBUF="$STDBUF -i0 -o0"
  14. fi
  15. if [ -n "$(sed 2>&1 | grep -- -u,)" ]; then
  16. SED="sed -u"
  17. else
  18. SED="${STDBUF:+$STDBUF }sed"
  19. fi
  20. GREP="${STDBUF:+$STDBUF }grep"
  21. # Colours
  22. #
  23. NORMAL="$(printf '\x1b[39;49m')"
  24. COLOUR="$NORMAL"
  25. RED="$(printf '\x1b[31m')"
  26. GREEN="$(printf '\x1b[32m')"
  27. YELLOW="$(printf '\x1b[33m')"
  28. BLUE="$(printf '\x1b[34m')"
  29. MAGENTA="$(printf '\x1b[35m')"
  30. CYAN="$(printf '\x1b[36m')"
  31. # shell helpers
  32. #
  33. die() {
  34. local arg0="$(basename "$0")"
  35. if [ $# -eq 0 ]; then
  36. sed -e "s!^!$arg0 :"
  37. else
  38. echo "$arg0: $@"
  39. fi >&2
  40. exit 1
  41. }
  42. cat <<EOT >&2
  43. # $PWD
  44. # $0 $*
  45. EOT
  46. # arguments
  47. #
  48. while [ $# -gt 0 ]; do
  49. case "${1:-}" in
  50. -f)
  51. # prefilter from
  52. FROM="$2"
  53. shift
  54. ;;
  55. -u)
  56. # prefilter until
  57. UNTIL="$2"
  58. shift
  59. ;;
  60. -e)
  61. # highlight pattern
  62. #
  63. if [ "$COLOUR" = "$RED" ]; then
  64. COLOUR="$GREEN"
  65. elif [ "$COLOUR" = "$GREEN" ]; then
  66. COLOUR="$MAGENTA"
  67. elif [ "$COLOUR" = "$MAGENTA" ]; then
  68. COLOUR="$YELLOW"
  69. elif [ "$COLOUR" = "$YELLOW" ]; then
  70. COLOUR="$CYAN"
  71. elif [ "$COLOUR" = "$CYAN" ]; then
  72. COLOUR="$BLUE"
  73. else
  74. COLOUR="$RED"
  75. fi
  76. case "$2" in
  77. "^"*"$") PATTERN="$2" ;;
  78. "^"*) PATTERN="$2.*" ;;
  79. *"$") PATTERN=".*$2" ;;
  80. *) PATTERN=".*$2.*"
  81. esac
  82. SED_ARGS="${SED_ARGS:+$SED_ARGS }-e 's!$PATTERN!$COLOUR\0$NORMAL!g'"
  83. shift
  84. ;;
  85. # simple grep options with arguments
  86. -C|-A|-B)
  87. GREP_ARGS="${GREP_ARGS:+$GREP_ARGS }$1 $2"
  88. shift
  89. ;;
  90. # grep options with merged arguments
  91. -C*|-A*|-B*)
  92. GREP_ARGS="${GREP_ARGS:+$GREP_ARGS }'$1'"
  93. ;;
  94. # complex grep options with arguments
  95. -E)
  96. GREP_ARGS="${GREP_ARGS:+$GREP_ARGS }$1 '$2'"
  97. shift
  98. ;;
  99. # -g is `grep -e`
  100. -g)
  101. GREP_ARGS="${GREP_ARGS:+$GREP_ARGS }-e '$2'"
  102. shift
  103. ;;
  104. # -v is `grep -v e`
  105. -v)
  106. GREPV_ARGS="${GREPV_ARGS:+$GREPV_ARGS }-e '$2'"
  107. shift
  108. ;;
  109. # simple grep options without arguments
  110. -i)
  111. GREP_ARGS="${GREP_ARGS:+$GREP_ARGS }$1"
  112. ;;
  113. --) shift
  114. break
  115. ;;
  116. # any other option
  117. -*)
  118. die "$1 unsupported"
  119. ;;
  120. # straight arguments
  121. *)
  122. break
  123. ;;
  124. esac
  125. shift
  126. done
  127. #
  128. # compose pipeline
  129. #
  130. PIPELINE=
  131. # GREP -v FILTER
  132. if [ -n "${GREPV_ARGS:-}" ]; then
  133. PIPELINE="${PIPELINE:+$PIPELINE | }$GREP -a -v $GREPV_ARGS"
  134. fi
  135. # FROM/UNTIL FILTER
  136. if [ -n "${FROM:-}${UNTIL:-}" ]; then
  137. PIPELINE="${PIPELINE:+$PIPELINE | }$SED"
  138. [ -z "${FROM:-}" ] || PIPELINE="$PIPELINE -e '0,/$FROM/d'"
  139. [ -z "${UNTIL:-}" ] || PIPELINE="$PIPELINE -e '/$UNTIL/,\$d'"
  140. # no grep? combine both sed calls
  141. if [ -z "${GREP_ARGS:-}" -a -n "${SED_ARGS:-}" ]; then
  142. PIPELINE="$PIPELINE $SED_ARGS"
  143. SED_ARGS=
  144. fi
  145. fi
  146. # GREP FILTER
  147. if [ -n "${GREP_ARGS:-}" ]; then
  148. PIPELINE="${PIPELINE:+$PIPELINE | }$GREP -a $GREP_ARGS"
  149. fi
  150. # HIGHLIGHT
  151. if [ -n "${SED_ARGS:-}" ]; then
  152. PIPELINE="${PIPELINE:+$PIPELINE | }$SED $SED_ARGS"
  153. fi
  154. #and run
  155. if [ $# -eq 0 ]; then
  156. eval "${PIPELINE:-cat}"
  157. elif [ -n "$PIPELINE" ]; then
  158. "$@" | $PIPELINE
  159. else
  160. "$@"
  161. fi