1

Working on a script to fit a specific format. I need the results of the command to be echoed between pipes | X |.

When I try to use du -ksh it always brings a carriage return.

Any idea how to deal with it?

#!/bin/bash
echo -e "|_. Sites-enabled |_. ServerName |_. ServerAlias |_. UserID |_. DocumentRoot |_. Dig ServerName |_. Dig ServerAlias |"
ls /etc/apache2/sites-enabled/* | while read fichier

do

# SiteName & ServerName & ServerAlias & UserID
    sitename=($(echo $fichier | cut -d"/" -f5))
    serverName=`awk -F"ServerName" '/ServerName/{printf "%s ",$2}' $fichier`
    serverAlias=`awk -F"ServerAlias" '/ServerAlias/{printf "%s ",$2}' $fichier`
    userID=`awk '/AssignUserID/ {printf "%s ",$2}' $fichier`

echo -e "| "$sitename" | "$serverName" | "$serverAlias" | "$userID" | "
# Size DocumentRoot
    home=($(awk -F"DocumentRoot" '/DocumentRoot/{print $2}' $fichier))
    for i in "${home[@]}"
    do
    du -ksh $i && echo -e "|\n"
    done

Edit for @muru :

hey thanks for your answer. I'm really new in shell-scripting just learning it since a couple days.

I need to export values of my virtualhosts in apache2 sites-enabled like ServerName ServerAlias DocumentRoot and so on. From there I run a du ksh on the extracted Document Root to see the size of eacj website hosted. Afterwards the script will run a dig on the extracted Servername & aliases to check where it really points out.

The final format would be ideally set in a "board" to be exploited online on a website that uses a special format for it (each first title rows start with pipe+underscore+dot |_. the last rows end with pipe only then each line after the fist one start and end with a pipe).

However when running the script I can't make the desired format work, if I put the echo -e "| \n" outside of the for ; it seems it stops at the first DocumentRoot found in a virtualhost. If i have a website with multi vhost inside it fails to take them all into account.

I suspected something related to the carriage returns cause the output is really weird for me.

EDIT 2019-04-11

switched from echoto printf. feels better.

#!/bin/bash
#============================================================================================
#
# FILE: getvhost.sh
#
# USAGE: getvhost.sh
#
# DESCRIPTION: Find all virtualhosts enabled in apache2; extract their servernames & aliases,
# get the total size of the websites enabled from documentroot section, extract their userid,
# performs  DNS lookups from servernames & aliases
# Display and format the answers to be use and copy-paste in https://plan.io :
# |_. TITLE1 |_. TITLE2    |_. TITLE3     |_. ... |
# | site1    | servername1 | serveralias1 |   ... |
# | site2    | servername2 | serveralias2 |   ... |
#
# OPTIONS: ---
# REQUIREMENTS: apache2 with sites-enabled in /etc/apache2/sites-enabled
# BUGS: ---
# NOTES: ---
# AUTHORS: ---
# COMPANY: ---
# VERSION: 1.1
# CREATED: 2019.04.07
# REVISION: 2019.04.11
#============================================================================================


echo -e "|_. Sites-enabled |_. ServerName |_. ServerAlias |_. UserID |_. DocumentRoot |_. Dig ServerName |_. Dig ServerAlias |"
ls /etc/apache2/sites-enabled/* | while read file

do
        #--------------------------------------------------
        # Get sitename & serverName & serverAlias & userID
        #--------------------------------------------------
        sitename=($(echo $file | cut -d"/" -f5))
        serverName=`awk -F"ServerName" '/ServerName/{printf "%s ",$2}' $file`
        serverAlias=`awk -F"ServerAlias" '/ServerAlias/{printf "%s ",$2}' $file`
        userID=`awk '/AssignUserID/ {printf "%s ",$2}' $file`
        echo -e " | " $sitename " | " $serverName " | " $serverAlias " | " $userID " | \c"

        #-------------------------------------------------
        # Get Size of websites from DocumentRoot
        #-------------------------------------------------

        home=($(awk -F"DocumentRoot" '/DocumentRoot/{print $2}' $file))
        for i in "${home[@]}"
        do
          size=`du -sh $i`
          printf "%s  " $size
        done

        echo -e "|"

        #-----------------------------------------------
        # DIG on both ServerName & ServerAlias
        #-----------------------------------------------

        dig=($(awk -F"ServerName" '/ServerName/{print $2}' $file))
        for i in "${dig[@]}"
        do
          dig1=`dig +noall +answer +short $i`
          printf "%s  " $dig1
        done

        echo -e "|"

        dig=($(awk -F"ServerAlias" '/ServerAlias/{print $2}' $file))
        for i in "${dig[@]}"
        do
          dig2=`dig +noall +answer +short $i`
          printf "%s  " $dig2
        done

        echo -e "|"

done
8
  • 1
    echo "$(du -ksh "$i")|"? The indentation is weird making it hard to understand, and it looks like you're running du in a loop. Do you want a pipe and newline after each output of du?
    – muru
    Commented Apr 9, 2019 at 11:08
  • According to hexdump, there is no carriage return in the output of du -ksh. I suspect that this question is incorrectly describing something else as a carriage return.
    – JdeBP
    Commented Apr 9, 2019 at 12:50
  • had to edit the post to answer you muru because it was too long for a simple comment :) @ JdeBp thanks then the problem should be elswhere for me.
    – Ant69
    Commented Apr 9, 2019 at 13:57
  • 1
    Welcome on U&L! "Carriage return" is <CR>, or ASCII code 0D, as in Windows' newline sequence. Here we are probably talking about "line feed", or ASCII 0A, the newline character in *nix. I guess that what muru is suggesting is to change the whole du -ksh $i && echo -e "|\n" line into echo "$(du -ksh $i)": the command substitution $(...) will strip the trailing newline(s). But, better, you should probably add a sample of the file(s) you are parsing and a sample of the desired output to your question, allowing other users to give you some reasoned advice.
    – fra-san
    Commented Apr 9, 2019 at 14:45
  • didnt know you could put a command substitution like that into an echo, I will try this tomorrow at work. For the files those are common virtualhost declaration in apache2. e.g httpd.apache.org/docs/2.4/vhosts/examples.html for the desired output gyazo.com/d8b77ff45aa9155ea10fed480e86fa85
    – Ant69
    Commented Apr 9, 2019 at 15:31

1 Answer 1

1

Couldn't get the desired output with echo "$(du -ksh $i)". Switched the echo to printf and got the desired output. Can't really explain it but still, works.

2
  • Ah, now I see it better. du -ksh $i && echo -e "|\n" prints a <newline> for every loop iteration, and so does echo "$(du -ksh $i)" (to suppress the <newline> you may use echo -n); printf "%s " $dig2 doesn't, and is generally a better choice: see Why is printf better than echo?.
    – fra-san
    Commented Apr 11, 2019 at 18:21
  • Note that my original suggestion was to include the pipe in this command (so: echo "$(du -ksh)|"). The command substitution removes trailing newlines, and echo adds a newline by default. By including the pipe in the same command, we print the pipe before echo adds a newline
    – muru
    Commented Apr 17, 2019 at 7:44

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .