RRDTool GPRINT formatting with printf

15,258

Try this line:

GPRINT:Cost:AVERAGE:"$(printf ' cost %11s' £%.2lf | sed 's/\£/\£ /g')\\n" \

I changed the inner " marks to ' marks and removed the backslashes.

Share:
15,258
general exception
Author by

general exception

An enthusiastic, multi-skilled computer programmer with 10 years progressive experience in software development. Competent in a range of technologies varying from web orientated languages to back end and database technologies. Mostly involved with Microsoft .NET but not limited to. I learn new skills quickly and thrive on being challenged by new opportunities. I have excellent communication skills and am a proven mentor. I am a natural teacher and take great pride in sharing my skills with others. I believe in using illustrative concepts to help others understand complex situations and frequently use this approach when providing guidance and training. Excellent analytical skills and a logical thinking process makes me a strong problem solver. I am also a fluent Welsh speaker.

Updated on July 06, 2022

Comments

  • general exception
    general exception almost 2 years

    Closely related to this question: Bash printf prefix

    I have the following Bash script that is generating an RRDGraph with RRDTool.

    #!/bin/bash
    
    now=$(date +%s)
    now_formatted=$(date +%s | awk '{printf "%s\n", strftime("%c",$1)}' | sed -e 's/:/\\:/g')
    
    # create power graph for last week
    /usr/bin/rrdtool graph /var/www/power-week.png \
    --start end-7d --width 543 --height 267 --end $now-1min --slope-mode \
    --vertical-label "Watts" --lower-limit 0 \
    --alt-autoscale-max \
    --title "Power: Last week vs. week before" \
    --watermark "(©) $(date +%Y) Alyn R. Tiedtke" \
    --font WATERMARK:8 \
    DEF:Power=/root/currentcost/ccdata.rrd:Power:AVERAGE \
    DEF:Power2=/root/currentcost/ccdata.rrd:Power:AVERAGE:end=$now-7d1min:start=end-7d \
    VDEF:Last=Power,LAST \
    VDEF:First=Power,FIRST \
    VDEF:Min=Power,MINIMUM \
    VDEF:Peak=Power,MAXIMUM \
    VDEF:Average=Power,AVERAGE \
    CDEF:kWh=Power,1000,/,168,* \
    CDEF:Cost=kWh,.1029,* \
    SHIFT:Power2:604800 \
    LINE1:Power2#00CF00FF:"Last Week\\n" \
    HRULE:Min#58FAF4:"Min    " \
    GPRINT:Power:MIN:"%6.2lf%sW" \
    COMMENT:"\\n" \
    LINE1:Power#005199FF:"Power  " \
    AREA:Power#00519933:"" \
    GPRINT:Last:"%6.2lf%sW" \
    COMMENT:"\\n" \
    HRULE:Average#9595FF:"Average" \
    GPRINT:Power:AVERAGE:"%6.2lf%sW" \
    COMMENT:"\\n" \
    HRULE:Peak#ff0000:"Peak   " \
    GPRINT:Power:MAX:"%6.2lf%sW" \
    COMMENT:"\\n" \
    GPRINT:kWh:AVERAGE:"  total    %6.2lfkWh\\n" \
    GPRINT:Cost:AVERAGE:"  cost     %6.2lf £\\n" \
    GPRINT:Cost:AVERAGE:"$(printf \\" cost %11s\\" £%.2lf | sed 's/\£/\£ /g')\\n" \
    COMMENT:" \\n" \
    GPRINT:First:"Showing from %c\\n":strftime \
    GPRINT:Last:"          to %c\\n":strftime \
    COMMENT:"  Created at $now_formatted"
    

    Which produces a graph like this (notice the leading \ on the lower cost line in the legend):-

    RRD Power over Week

    Concentrating specifically on the following line:-

    GPRINT:Cost:AVERAGE:"$(printf \\" cost %11s\\" £%.2lf | sed 's/\£/\£ /g')\\n" \
    

    This is the line that is printing out the lower cost line in the legend.

    I am passing a GPRINT formatted value of £4.54 to Bash's printf function to be padded out to 11 spaces and a cost label prefixed on it. I am then piping this to sed to add a space between the £ and the actual value.

    What I want to know is, why is the escaped \ coming through in the output? If I remove the \\ just after printf bash complains that something is missing.

    How would I suppress this \ from coming through in the output.