Combina vários comandos em um script de shell

0

Eu só consigo o resultado desejado quando executo o comando um por um. Como posso combinar todo o comando em um script de shell e obter a saída desejada?

//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"
    
por Fayne 02.07.2018 / 10:11

2 respostas

0

Coloque todos os seus comandos em um arquivo, digamos myCommands. Observe o #!/bin/sh na primeira linha. Isso é chamado de shebang, ele diz ao shell com qual programa interpretar o script, quando executado.

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

Em seguida, torne-o executável:

chmod +x myCommands

Agora, você pode usá-lo usando ./myCommands se estiver na mesma pasta, ou symply myCommands se o arquivo de script estiver em um antigo incluído na variável $PATH .

    
por 02.07.2018 / 10:19
1

O script a seguir fará as coisas equivalentes que seus comandos estão fazendo, mas sem criar muitos arquivos intermediários:

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

Isso usa um único script awk para inserir a coluna de registro de dados no início e para converter a saída em registros delimitados por vírgulas. Ele reutiliza o cabeçalho de saída de vmstat e coleta 100 linhas de vmstat output com um intervalo de cinco segundos. Eu também alterei o delimitador usado na instrução PostrgeSQL para uma vírgula, já que é isso que os dados estão usando.

O script espera que awk seja GNU awk como encontrado na maioria dos sistemas Linux.

    
por 02.07.2018 / 11:02