複数のshellコマンドを一度に実行する

[概要] 本記事では、いくつかのShellスクリプトを、取りまとめて実行する方法について解説します。
いわゆる、「シェルスクリプト」というやつの使い方になります。


[まくら] 前の記事で、macのターミナルを使ったcsvファイルのダウンロードと、データの処理について解説しました。
shellスクリプトを利用すると、webブラウザを経由することなく、手早く情報の処理が行えることが分かったかと思います。
黒い画面を見ると恐怖を感じる人も多いかもしれませんが、かんたんなスクリプトを組めると、同じことを何度もする必要がある場合に、時間を大きく節約できます。

さて、前回の記事では、近畿の各県の情報、全国の、その日その日の死者数についての情報を、それぞれcsv形式で保存するスクリプトを紹介しました。

都合、5本のコマンドを実行すればこれらの情報をすべて得られます。

でも、めんどくさいですよね。
人によっては、47都道府県の情報をすべて個別に取得したいひともいるでしょう。
やってられません!
大丈夫です。めんどくさいをなんとかしてくれるのが、コンピュータです。


[流れ]
1. 適当なテキストエディタを開く
2. 実行したいシェルスクリプトをそこに貼り付ける
3. 一番はじめの行に、「#!/bin/sh」と書いて、名前をつけて保存する
4. ターミナルから、先程作ったスクリプトを実行する

簡単ですよね?

[詳説]
1. 適当なテキストエディタを開く
なんでもよいです。macであれば、テキストエディットで大丈夫です。
少しプログラミングに興味がある人であれば、プログラミング用のエディタである、
Visual Studio Code (VS Code)」をインストールしてもよいかもしれません。
カッコの後ろ半分を補完してくれたり、一括変換が便利だったりします。

プログラミングをしていると、カッコで挟んで、それをまたカッコで挟んで、、、このカッコ、どれと対応してるん?見たいな状況がよくあるのですが、色を自動で変えてみやすくしてくれたりします。

マイクロソフト社製です。MS社にはあまり良いイメージはなかったんですが、VS Codeはオープンソースであったり、なんだかMSっぽくない、新しい風を感じるエディタです。

2. 実行したいシェルスクリプトをそこに貼り付ける
前回の記事で紹介した、大阪と京都のデータを引っ張ってくる、2つのスクリプトを頻繁に使うとしましょう。


curl https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv | cut -d ',' -f 1,8,10,11| sed -e 's|/2020||g' -e 's|,4/|,2020/4/|g' -e 's|,3/|,2020/3/|g' -e 's|,2/|,2020/2/|g' -e 's|,1/|,2020/1/|g' | grep -e 大阪 | nkf -s > COVID-19-osaka$(date +%m%d).csv



curl https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv | cut -d ',' -f 1,8,10,11| sed -e 's|/2020||g' -e 's|,4/|,2020/4/|g' -e 's|,3/|,2020/3/|g' -e 's|,2/|,2020/2/|g' -e 's|,1/|,2020/1/|g' | grep -e 京都府 | nkf -s > COVID-19-kyoto$(date +%m%d).csv

これらは、大阪と京都の情報を引っ張ってくるためのコマンドです。
これを、テキストファイルに貼り付けましょう。

3. 一番はじめの行に、「#!/bin/sh」と書いて、名前をつけて保存する
これだけです。そのまんま!
どこに保存するかが重要です。デスクトップでもいいですし、ホームディレクトリ(あなたの名前がついたフォルダ)でもオッケーです。
名前は、「covid-19-osaka-kyoto.sh」とでもしておきましょう。
拡張子に指定はないのですが、「.sh」とつけることが一般的なようです。

蛇足かとも思いますが、以下のような内容のファイルになります。ほんまにこれだけ。
__________
#!/bin/sh

curl https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv | cut -d ',' -f 1,8,10,11| sed -e 's|/2020||g' -e 's|,4/|,2020/4/|g' -e 's|,3/|,2020/3/|g' -e 's|,2/|,2020/2/|g' -e 's|,1/|,2020/1/|g' | grep -e 大阪 | nkf -s > COVID-19-osaka$(date +%m%d).csv

curl https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv | cut -d ',' -f 1,8,10,11| sed -e 's|/2020||g' -e 's|,4/|,2020/4/|g' -e 's|,3/|,2020/3/|g' -e 's|,2/|,2020/2/|g' -e 's|,1/|,2020/1/|g' | grep -e 京都府 | nkf -s > COVID-19-kyoto$(date +%m%d).csv
__________

4. ターミナルから、先程作ったスクリプトを実行する
ターミナルを開き、先程作成した .sh のファイルがあるところに移動します。

わからない人は、「ディレクトリ」について調べて、
cd コマンド、ls コマンド、pwd コマンドについて調べたら大丈夫!

そして、以下のコマンドを実行しましょう。

$ sh covid-19-osaka-kyoto.sh

自動で、以下の2つのファイルが、そのディレクトリにできているはず!
COVID-19-osaka$(date +%m%d).csv
COVID-19-kyoto$(date +%m%d).csv

動かないのだが---? そんな人もいるかも知れません。
おそらく、そのファイルに「実行権限」が与えられていないのが原因です。
スクリプトファイルは、悪意のある他人に、勝手に実行されると危険なことがあります。
なので、どれでも勝手に実行できないようになっていたりします。
そういう場合は以下の、ファイルの実行権限を与えるコマンドで、使えるようにします。

$ chmod u+x covid-19-osaka-kyoto.sh

以上です!割と簡単ですよね。

応用(スクリプトの書き換え)
1. デスクトップからこのスクリプトを実行すると、ファイルが2つ生成します。
適当な名前をつけたフォルダに格納したいですよね?

フォルダは、mkdir というコマンドで作成することができます。
その日の日付を、フォルダの名前に使いたかったら、前回紹介した date コマンドを使えばOKです。
$(date) とすることで、date コマンドで呼び出したその日の日付を、あなたが手で打ち込んだかのように使うことができます。
cd コマンドで、いましがた作ったフォルダの中に、入ります。

2. 上のスクリプトを見ると、大阪と京都のデータを得るために、2度同じファイルをダウンロードしています。一番はじめのcurlのところですね。
相手のサーバーに、負荷がかかりますし、非効率なことは改善すべきです。

こういうのを改善したかったら、スクリプトを少し書き換えてやればオッケーです。
下の例では、ダウンロード(curl)したファイルの不必要な行を捨て(cut)たあと、日付の形式(sed)を整え、日付の名前をつけて出力しています。
続いて、そのファイルを開けて、死者数のファイル、京都府、大阪府、兵庫県、奈良県、滋賀県の感染者、のファイルをそれぞれ生成しています。

__________

#!/bin/sh



mkdir $(date +%m%d)

cd $(date +%m%d)

curl https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv | cut -d ',' -f 1,6,8,10,11,24,27 | sed -e 's|/2020||g' -e 's|,4/|,2020/4/|g' -e 's|,3/|,2020/3/|g' -e 's|,2/|,2020/2/|g' -e 's|,1/|,2020/1/|g' > COVID-19-$(date +%m%d).csv

grep -v ",," COVID-19-$(date +%m%d).csv > COVID-19-death$(date +%m%d).csv
grep -e 京都府 COVID-19-$(date +%m%d).csv | cut -d ',' -f 1,3,4,5 | nkf -s > COVID-19-kyoto$(date +%m%d).csv
grep -e 大阪 COVID-19-$(date +%m%d).csv | cut -d ',' -f 1,3,4,5 | nkf -s > COVID-19-osaka$(date +%m%d).csv
grep -e 兵庫 COVID-19-$(date +%m%d).csv | cut -d ',' -f 1,3,4,5 | nkf -s > COVID-19-hyogo$(date +%m%d).csv
grep -e 奈良 COVID-19-$(date +%m%d).csv | cut -d ',' -f 1,3,4,5 | nkf -s > COVID-19-nara$(date +%m%d).csv
grep -e 滋賀 COVID-19-$(date +%m%d).csv | cut -d ',' -f 1,3,4,5 | nkf -s > COVID-19-shiga$(date +%m%d).csv
__________

[04/15日追記] "COVID-19-$(date"の部分が、正しく表示されていないようです。
なぜかイタリック体で表示されてしまう。。すみません。
化けないように、ドルの記号をあえて全角表記すると、
正しくは、"COVID-19-(date" です。

気になる情報については、自分でどんどん分析してみましょう。
初心者向けのシェルスクリプトの組み方については、以下のページが参考になります。

https://mac-ra.com/shellscript-kihon/
https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337

コメント

このブログの人気の投稿

VNCで見ている画面と自分のマシンの間でのコピー&ペースト

Natural Bond Orbital (NBO) Analysis, 自然軌道解析をやってみる

Lanl2DZの使い方