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
echo "$(du -ksh "$i")|"? The indentation is weird making it hard to understand, and it looks like you're runningduin a loop. Do you want a pipe and newline after each output ofdu?hexdump, there is no carriage return in the output ofdu -ksh. I suspect that this question is incorrectly describing something else as a carriage return.<CR>, or ASCII code0D, as in Windows' newline sequence. Here we are probably talking about "line feed", or ASCII0A, the newline character in *nix. I guess that what muru is suggesting is to change the wholedu -ksh $i && echo -e "|\n"line intoecho "$(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.