Bash 脚本:在同一行中打印列数据

Bash 脚本:在同一行中打印列数据

我编写了一个 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' "$@"
)

相关内容