여러 명령을 하나의 쉘 스크립트로 결합

여러 명령을 하나의 쉘 스크립트로 결합

명령을 하나씩 실행해야만 원하는 결과를 얻을 수 있습니다. 쉘 스크립트의 모든 명령을 결합하고 원하는 출력을 얻으려면 어떻게 해야 합니까?

//insert timestamp column
$ vmstat -n 5 | (while read; do echo "$(date +%Y-%m-%d.%H:%M:%S) $REPLY"; done)> vm.txt 
//remove 1st & 2nd row
$ sed '1,2d' vm.txt > vm2.txt 
//convert text file to csv
$ sed 's/^  *//;s/  */,/g'  vm2.txt > vm2.csv 
//insert column name
$ echo $'datetime, r, b, swpd, free, buff, cache, si, so, bi, bo, in, cs, us, sy, id, wa, st' | cat - vm2.csv> chart.csv
$ psql -p 5432 -U postgres -c  "\copy vmstat FROM '/root/report/chart.csv' delimiter '|' csv header"

답변1

다음 스크립트는 명령이 수행하는 것과 동일한 작업을 수행하지만 중간 파일을 많이 생성하지는 않습니다.

#!/bin/sh

report=/root/report/chart.csv

vmstat -n 5 100 |
awk -vOFS=',' 'NR == 1 { next }
               NR == 2 { $1 = "datetime" OFS $1 }
               NR  > 2 { $1 = strftime("%F.%T", systime()) OFS $1 } 1' >"$report"

psql -p 5432 -U postgres -c "COPY vmstat FROM '$report' DELIMITER ',' CSV HEADER"

이는 단일 awk스크립트를 사용하여 시작 부분에 날짜 스탬프 열을 삽입하고 출력을 쉼표로 구분된 레코드로 변환합니다. 출력 헤더를 재사용하고 vmstat5초 간격으로 100줄의 출력을 수집합니다. vmstat또한 PostrgeSQL 문에 사용된 구분 기호를 쉼표로 변경했습니다. 왜냐하면 이것이 데이터에 사용되는 구분 기호이기 때문입니다.

스크립트는 대부분의 Linux 시스템에서 GNU일 것으로 예상합니다 awk.awk

답변2

모든 명령을 파일(myCommands라고 가정)에 넣습니다. #!/bin/sh첫줄을 주목해주세요 . 이것을 shebang이라고 하며 실행 중에 스크립트를 해석하는 데 사용할 프로그램을 쉘에 알려줍니다.

#!/bin/sh
# insert timestamp column
vmstat -n 5 | (while read; do echo "$(date +%Y-%m-%d.%H:%M:%S) $REPLY"; done)> vm.txt 
# remove 1st & 2nd row
sed '1,2d' vm.txt > vm2.txt 
# convert text file to csv
sed 's/^  *//;s/  */,/g'  vm2.txt > vm2.csv 
# insert column name
echo $'datetime, r, b, swpd, free, buff, cache, si, so, bi, bo, in, cs, us, sy, id, wa, st' | cat - vm2.csv> chart.csv
psql -p 5432 -U postgres -c  "\copy vmstat FROM '/root/report/chart.csv' delimiter '|' csv header"

다음으로 실행 가능하게 만듭니다.

chmod +x myCommands

./myCommands이제 동일한 폴더에 있거나 myCommands스크립트 파일이 변수에 포함된 이전 버전에 있는 경우 이를 사용할 수 있습니다 $PATH.

관련 정보