Linux

在一個 shell 腳本中組合多個命令

  • July 2, 2018

我只有在逐條執行命令時才能得到期望的輸出。如何在 shell 腳本中組合所有命令並獲得所需的輸出?

//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"

將所有命令放在一個文件中,比如說 myCommands。注意#!/bin/sh第一行的。這稱為 shebang,它告訴 shell 在執行時用什麼程序解釋腳本。

#!/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變數中包含的舊版本中,則可以使用它。

以下腳本將執行您的命令正在執行的等效操作,但不會創建這麼多中間文件:

#!/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腳本在開頭插入 datestamp 列並將輸出轉換為逗號分隔的記錄。它重用輸出的標頭並以 5 秒的間隔vmstat收集 100 行輸出。vmstat我還將 PostrgeSQL 語句中使用的分隔符更改為逗號,因為這是數據使用的。

該腳本期望是大多數 Linux 系統上awk的 GNU 。awk

引用自:https://unix.stackexchange.com/questions/452981