複数のコマンドを1つのシェルスクリプトにまとめる

複数のコマンドを1つのシェルスクリプトにまとめる

コマンドを1つずつ実行しなければ、必要な結果が得られます。シェルスクリプトのすべてのコマンドを組み合わせて目的の出力を取得するにはどうすればよいですか?

//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であると予想していますawkawk

答え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

関連情報