From 9e49a626064c86ca43575301206714d2ae7d77b5 Mon Sep 17 00:00:00 2001 From: davidovski Date: Sun, 13 Feb 2022 18:10:19 +0000 Subject: will not match : in glob matching --- src/parseconf | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/parseconf.sh | 2 +- test/parseconf.sh | 2 +- 3 files changed, 108 insertions(+), 2 deletions(-) create mode 100755 src/parseconf diff --git a/src/parseconf b/src/parseconf new file mode 100755 index 0000000..44089b7 --- /dev/null +++ b/src/parseconf @@ -0,0 +1,106 @@ +#!/bin/bash + +usage () { + printf "Usage $0 " + echo << "EOF" +OPTIONS... [FILTER] + +Print the parsed config file filtering by the keys +Arguments: + -f file read configuration from a file, uses /dev/sdtin otherwise + -v only print values + -c n print the last [n] +EOF +} + +# print the parsed values from the config file in key:value format +# +parse () { + local file="$1" + local level="" + local list="" + while IFS= read -r line; do + line=$(sed "s/\s\+/ /g" <<< "$line" | sed "s/^\s\|\s$\|;*$//g") + + grep -q "^#" <<< "$line" && continue + grep -q "." <<< "$line" || continue + + local key=$(echo $line | cut -d" " -f1) + local value=$(echo $line | cut -d" " -f2-) + + [ "$key" = "include" ] && parse $value && continue + + case ${value: -1} in + "{") + level="$level$key." + ;; + "[") + list="$list$key." + printf "$level$key:" + ;; + "}") + level=$(sed "s/[^\.]\w*\.$//g" <<< "$level") + ;; + "]") + printf "\n" + list=$(sed "s/[^\.]\w*\.$//g" <<< "$list") + ;; + *) + + grep -q "." <<< "$list" && + printf "$line " || + printf "$level$key:$value\n" + ;; + esac + done < "$file" +} + +# Filter the parsed file for specific keys +# +filter () { + local pattern= + + [ $# = 0 ] && + pattern=".*" || + pattern=$(sed "s/\*/[^:]*/g"<<< "$@") + + $print_keys && + pattern="s/^($pattern:.+)/\1/p" || + pattern="s/^$pattern:(.+)/\1/p" + + + parse $CONF_FILE | sed -rn $pattern +} + +# Use the env variable if exists +[ -z ${CONF_FILE} ] && CONF_FILE="/dev/stdin" + +# initialise options +print_keys=true +count= + +while getopts ":f:c:v" opt; do + case "${opt}" in + f) + [ "${OPTARG}" = "-" ] && + CONF_FILE="/dev/stdin" || + CONF_FILE="${OPTARG}" + ;; + + v) + print_keys=false + ;; + c) + count="${OPTARG}" + ;; + *) + esac +done + +shift $((OPTIND-1)) + +[ -z ${count} ] && + filter "$@" || + filter "$@" | tail -n $count + + diff --git a/src/parseconf.sh b/src/parseconf.sh index c5ed801..44089b7 100755 --- a/src/parseconf.sh +++ b/src/parseconf.sh @@ -62,7 +62,7 @@ filter () { [ $# = 0 ] && pattern=".*" || - pattern=$(sed "s/\*/.*/g"<<< "$@") + pattern=$(sed "s/\*/[^:]*/g"<<< "$@") $print_keys && pattern="s/^($pattern:.+)/\1/p" || diff --git a/test/parseconf.sh b/test/parseconf.sh index 3095e18..3af55e1 100755 --- a/test/parseconf.sh +++ b/test/parseconf.sh @@ -1,6 +1,6 @@ #!/bin/sh -PARSECONF="./src/parseconf" +PARSECONF="./src/parseconf.sh" SIMPLECONF="./test/simple.conf" -- cgit v1.2.1