サービス開発課の刈谷です。
Cloud Automatorでは、AWS EC2インスタンスの定期的な起動と停止を自動化しています。
サーバーワークスで働いている方々と話していると、業務の自動化についてお話をする機会が多いように感じ、 ■自分の作業で繰り返していることが無いか考え、その中で普段手作業でコピペしているファイルを自動的もしくはコマンド一撃で 作成出来ないか考えてみました。
■自分の作業で繰り返していること
- 前職では、毎日業務終了時に日報を書いて報告していた。前日分をSlackのチームチャンネルのスレッドから探してコピー後、修正や追記した内容をペーストしてメッセージ送信
シェルスクリプト(Bシェル)&cronで行けるのではないかという考えに落ち着き実装してみました。
定期実行と言っても難しい実装は無くLinuxが用意しているcrontabファイルに実行時間とコマンド(実行したいファイル)を記載するだけです。 ファイル(日報日付.md)を作成する実装は、命令を数行(※処理による)を.shファイルに記載するだけです。
.shファイルの実装は、第一段と第二段に分かれました。
最初「日報の雛形(daily_report.md)を用意して、それを毎日定期的にコピーして中身を変更したら良い。」と考えていたのですが、
日報ファイルの中身を変更している際に「昨日のファイルを開いて昨日のファイルにある【 ## 今日やったこと】をコピーして、新しく作成したファイルを開いて【## 昨日やったこと】に貼り付けるの面倒だな。一緒にやってしまおう。」と考え以下の内容になりました。
※シェルスクリプトについて学習して一週間程度ですので、お手柔らかにお願い致します(´-`).。oO
※もしファイルが作成出来なかったら…等の条件分岐は実装しておりません。
ここからは実装手順記載します。
環境
- CentOS7(VirtualBox)
- user root
第一段:ファイル作成&実装手順
①日報のフォーマットを記載したテキストファイルを作成する
vi daily_report.md
## 昨日やったこと HTML CSS ## 今日やったこと LINUX WINDOWS
②シェルスクリプトを実装するファイルを作成する
touch file_copy.sh
③file_copy.shに①をコピーしてdaily_report本日日付時間.mdファイル(daily_report2023-08-21-18-50.md)を作成する実装をする
vi file_copy.sh
#!/bin/bash today="$(date '+%F-%H-%M')" yesterday="$(date '+%F-%H-%M' --date '1 day ago')" dir="/home/calm/dr" cp "${dir}/daily_report.md" "${dir}/daily_report${today}.md"
④crontabへ作成したfile_copy.shを毎日18:50に実行する命令を実装する
cd /etc vi crontab
50 18 * * * root /home/calm/file_copy.sh
⑤問題無くファイルが作成出来たかを確認する
cd /home/calm/dr ls
■file_copy.sh
#!/bin/bash today="$(date '+%F-%H-%M')" yesterday="$(date '+%F-%H-%M' --date '1 day ago')" dir="/home/calm/dr" cp "${dir}/daily_report.md" "${dir}/daily_report${today}.md"
第二段:ファイル作成&実装手順
①日報のフォーマットを記載した前日分のmdファイルを作成する
※前日分ファイルをコピーして本日分ファイルを作成する実装のため、定期実行を開始したい前日の日付をファイル名に付ける
※定期実行の時間が毎日18時半のため定期実行を開始する時間をファイル名に付ける
vi daily_report2023-08-20-18-30.md
## 昨日やったこと HTML CSS ## 今日やったこと LINUX WINDOWS
②シェルスクリプトを実装するファイルを作成する
touch dr_copy.sh
③dr_copy.shに①をコピーしてdaily_report本日日付時間.mdファイル(daily_report2023-08-21-18-30.md)を作成する実装をする
#!/bin/bash #日報をコピー today="$(date '+%F-%H-%M')" yesterday="$(date '+%F-%H-%M' --date '1 day ago')" dir="/home/calm/dr" cp "${dir}/daily_report${yesterday}.md" "${dir}/daily_report${today}.md"
④新しく作成されたファイルの【昨日やったこと】の中身を空にする実装をする
#1.本日:昨日やったことの内容を削除 t_file_previous_entry_del=`sed "/## 今日やったこと/,//d" "${dir}/daily_report${today}.md" | sed "/## 昨日やったこと/d"` for i in ${t_file_previous_entry_del[@]} do sed -i "/${i}/d" "${dir}/daily_report${today}.md" done
⑤新しく作成された本日分ファイルの【今日やったこと】の中身を空にする実装をする
#2.本日:今日やったことの内容を削除 t_file_next_entry_del=`sed "/## 昨日やったこと/,/ /d" "${dir}/daily_report${today}.md"` for i in ${t_file_next_entry_del[@]} do sed -i "/${i}/d" "${dir}/daily_report${today}.md" done
⑥新しく作成された本日分ファイルの【昨日やったこと】に前日分ファイルの【今日やったことを】コピペする実装をする
#3.先日:今日やったことの内容を本日:昨日やったことへコピペ y_file_next_entry_t_file_previous_entry_set=`sed "/## 昨日やったこと/,/## 今日やったこと/d" "${dir}/daily_report${yesterday}.md"` for i in ${y_file_next_entry_t_file_previous_entry_set[@]} do sed -i "/## 昨日やったこと/a ${i}" "${dir}/daily_report${today}.md" done
⑦crontabへ作成したdr_copy.shを毎日18:30に実行する命令を実装する
cd /etc vi crontab
30 18 * * * root /home/calm/dr_copy.sh
⑧問題無く日報ファイルが作成出来たことを確認する
cd /home/calm/dr ls
■dr_copy.sh
#!/bin/bash #日報をコピー today="$(date '+%F-%H-%M')" yesterday="$(date '+%F-%H-%M' --date '1 day ago')" dir="/home/calm/dr" cp "${dir}/daily_report${yesterday}.md" "${dir}/daily_report${today}.md" #1.本日:昨日やったことの内容を削除 t_file_previous_entry_del=`sed "/## 今日やったこと/,//d" "${dir}/daily_report${today}.md" | sed "/## 昨日やったこと/d"` for i in ${t_file_previous_entry_del[@]} do sed -i "/${i}/d" "${dir}/daily_report${today}.md" done #2.本日:今日やったことの内容を削除 t_file_next_entry_del=`sed "/## 昨日やったこと/,/ /d" "${dir}/daily_report${today}.md"` for i in ${t_file_next_entry_del[@]} do sed -i "/${i}/d" "${dir}/daily_report${today}.md" done #3.先日:今日やったことの内容を本日:昨日やったことへコピペ y_file_next_entry_t_file_previous_entry_set=`sed "/## 昨日やったこと/,/## 今日やったこと/d" "${dir}/daily_report${yesterday}.md"` for i in ${y_file_next_entry_t_file_previous_entry_set[@]} do sed -i "/## 昨日やったこと/a ${i}" "${dir}/daily_report${today}.md" done
dr_copy.shのもっと実装したい点を列挙すると、
何度も出てくるディレクトリのみ共通化していること、最初手作業であること、ファイルが作成出来ない場合どうするのか実装されていないこと、前日休んでいた場合は前々日のファイルをコピーする必要がある等の実装が必要ですし、Slackへの投稿も自動で行いたいですね。ですので、スクリプトの伸びしろはあるかなと…w
最後にこのブログ皆様のシェルスクリプト学習の取っ掛かりになれば嬉しいです!!どうぞよろしくお願い致します。