데이터베이스 크기를 계산하고 PostgreSQL
스크립트가 실행된 날짜와 함께 출력을 텍스트 파일로 인쇄하는 bash 스크립트를 작성했습니다. 스크립트 코드는 다음과 같습니다.
#!/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
해결책은 서브쉘을 사용하는 것입니다.
#!/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' "$@"
)