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
Ant69
  • 21
  • 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 Apr 09 '19 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 Apr 09 '19 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 Apr 09 '19 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 Apr 09 '19 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 https://httpd.apache.org/docs/2.4/vhosts/examples.html for the desired output https://gyazo.com/d8b77ff45aa9155ea10fed480e86fa85 – Ant69 Apr 09 '19 at 15:31
  • didn't seem to work fine with the echo "$(du -ksh $i)"I still get the carriage return. However I finally changed for print finstead of echo – Ant69 Apr 11 '19 at 08:14
  • Could you flag ur comment as an answer either @JdeBp or @fra-san since the issue might not be directly coming from the du -kshitself ? – Ant69 Apr 11 '19 at 08:25
  • @Ant69 Since I still find your question a bit unclear, I feel it would be better if you posted an answer yourself, summarizing how you solved your issue or, if it is not solved, how you discovered the problem was not the one you presented in your question. You can even come back after 48 hours and accept it. – fra-san Apr 11 '19 at 14:17

1 Answers1

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.

fra-san
  • 10,205
  • 2
  • 22
  • 43
Ant69
  • 21
  • 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 Apr 11 '19 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 Apr 17 '19 at 07:44