我编写了一个 bash 脚本来计算数据库的大小PostgreSQL
,并在文本文件中打印输出以及脚本执行日期。脚本代码如下:
#!/bin/bash
date +"%d:%m" >> dbdata.growth
psql -h 192.168.2.173 -U postgres -c "select pg_database_size('ddb'); " | sed -n
'3,3p' | numfmt --to=iec >>dbdata.growth
psql -h 192.168.2.173 -U postgres -c "select pg_database_size('dpkidb'); " | sed
-n '3,3p' | numfmt --to=iec >>dbdata.growth
该脚本以如下所示的格式生成以下输出
26:03
134G
4.4M
26:03
134G
4.4M
对我来说,问题是我希望所有三列位于同一行。我怎样才能做到这一点?
答案1
替换所有输出行,例如:
date +"%d:%m" >> dbdata.growth
诸如以下的行:
date +"%d:%m" | tr -d $'\n' >> dbdata.growth
这用于tr
在将换行符放入输出文件之前删除换行符。
tr
是一个翻译或删除实用程序。在这种情况下,使用该-d
选项告诉它删除。我们要求它删除的字符是换行符,表示为$'\n'
。
答案2
解决方案是使用子 shell:
#!/bin/bash
var1=$(date +"%d:%m")
var2=$(psql -h 192.168.2.173 -U postgres -c "select pg_database_size('ddb'); " | sed -n '3,3p' | numfmt --to=iec)
var3=$(psql -h 192.168.2.173 -U postgres -c "select pg_database_size('dpkidb'); " | sed -n '3,3p' | numfmt --to=iec )
echo $var1 $var2 $var3 >>dbdata.growth
答案3
如果您知道有三列,则可以使用粘贴:
your_script.sh | paste - - -
答案4
#!/bin/bash
{ date +"%d:%m" >> dbdata.growth
psql -h 192.168.2.173 -U postgres -c "select pg_database_size('ddb'); " | sed -n
'3,3p' | numfmt --to=iec >>dbdata.growth
psql -h 192.168.2.173 -U postgres -c "select pg_database_size('dpkidb'); " | sed
-n '3,3p' | numfmt --to=iec >>dbdata.growth
} | (
#all output from your commands above piped to collector subshell below
set -f ; unset IFS ; set -- $(cat)
while [ $# -ge 3 ] ; do {
printf '%s\t%s\t%s\n' "$1" "$2" "$3"
shift 3 ; } ; done
printf '%s\t' "$@"
)