O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×

Ilstudy001_20110806

Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Próximos SlideShares
initramfsについて
initramfsについて
Carregando em…3
×

Confira estes a seguir

1 de 109 Anúncio

Mais Conteúdo rRelacionado

Diapositivos para si (20)

Semelhante a Ilstudy001_20110806 (20)

Anúncio

Mais recentes (20)

Ilstudy001_20110806

  1. 1. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ インターリンク株式会社 ICTサービス事業部 ネットワーク課 濱田 康貴 インターリンク株式会社
  2. 2. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 自己紹介 名前: 濱田 康貴 (はまだ やすたか) 所属: インターリンク株式会社 http://www.interlink.ne.jp/ 職業: インフラエンジニア 趣味: Linux、自転車、勉強会参加とか運営とか 7つ道具: vim bash パワポ netstat ps grep awk 将来の夢: GEEK団地(データセンタ併設住宅) 建設 インターリンク株式会社
  3. 3. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 今日のおしながき 1. シェルスクリプトの基礎知識 ~ どんなことができるの? ~ 2. シェルスクリプトのおやくそく 3-1. テキスト処理の効率化とログ解析サンプル 3-2. 簡単なルーチンワークと監視プログラム 4. 質疑応答 5. 懇親会 (希望者のみ) インターリンク株式会社
  4. 4. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 1. シェルスクリプトの基礎知識 ~ どんなことができるの? ~ インターリンク株式会社
  5. 5. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ シェルって何? インターリンク株式会社
  6. 6. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ shell = 貝殻? インターリンク株式会社
  7. 7. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ • シェル(殻)とは、ユーザから入力されたコマンドを解釈し、プロ グラムを起動するアプリケーションであり、OSの機能を実装してい るカーネル(中心核)を貝殻のように覆うようにして動作する。 今何時かな? shell date 命令応答 Unix Linux Kernel Thu Apr 21 11:53:44 JST 2011 インターリンク株式会社
  8. 8. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ カーネルと シェルの 役割 インターリンク株式会社
  9. 9. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~  カーネルのおしごと 1. シェルから渡されたコンピュータへの命令を実行する 2. CPUに計算させたりメモリに一時記憶したりハードディスクや SSDに記録したり・・・ インターリンク株式会社
  10. 10. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ シェルのおしごと 1. ユーザが入力したコマンドをカーネルに伝える(シェルは人の命 令を仲介しOSに実行させる) 2. プログラムを終了させたり、フォアグラウンド・バックグラウンドを 切り替えたりする 3. まとまった一連の入力をシェルスクリプトとして実行する 4. プログラムの出力をファイルにリダイレクトしたり、パイプに 渡すことで他のプログラムの入力としたりする 5. 変数や他のコマンドの出力結果を取り込んで加工し、出力 する インターリンク株式会社
  11. 11. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ シェルスクリプトで何ができるの? - コマンドを並べて順に実行する - リダイレクトを使ってコマンド実行結果をファイルに書きだす - パイプを使って次のコマンドに出力結果を渡す (コマンド実行結果をメールで飛ばすなど) - シェルスクリプトをcron実行することで、定時作業の省力化が できる など、作業品質の一定化と省力化を図ることができます。 インターリンク株式会社
  12. 12. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ シェルスクリプトってどうやって書くの? - シェルスクリプトを動かしたいコンピュータへSSHやtelnetなどで ログインし、viなどのエディタを使ってシェルスクリプトを書く - 手元のコンピュータでシェルスクリプトを書いてFTPやSCPなど を使い、シェルスクリプトを動かしたいコンピュータへアップロード する (文字コードや改行コードの違いに注意) - chmodコマンドを使い書き終わったシェルスクリプトへ実行権を つけて実行する インターリンク株式会社
  13. 13. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 2. シェルスクリプトのおやくそく インターリンク株式会社
  14. 14. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ シェルスクリプトには、いくつか約束ごとがあります。 1 シェルスクリプトを書いて実行する際のお約束 2 出力結果をリダイレクトする際のお約束 3 他コマンドの出力結果を取り込む際のお約束 4 変数を設定する際のお約束 インターリンク株式会社
  15. 15. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 1 シェルスクリプトを書いて実行する際のお約束 シェルスクリプトの先頭1行目には、スクリプトを読み込むインタプ リタを「#!」から始まる書き出しで記述します。 例) これらを「シバン (she- #!/bin/sh bang)」と呼びます #!/bin/bash #!/bin/csh インターリンク株式会社
  16. 16. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ シェルスクリプト内でコメントアウトするときは「#」を使います。 例) #!/bin/sh ← これはコメント行ではありません # ここで変数を設定する 赤く囲った箇所 (#より右側)は hoge=fuga 実行されません # 変数「hoge」を表示させる echo ${hoge} # ← fugaと表示される インターリンク株式会社
  17. 17. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ シェルスクリプトを動かすために、実行権をつけるか sh コマンドの 引数にスクリプトの名前を渡してあげる必要があります。 スクリプトに実行権をつけるには chmod 755 hoge.sh のように、chmodコマンドで実行権を付与します。 インターリンク株式会社
  18. 18. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 実行権がないシェルスクリプトを実行しようとするとこうなります。 sh-3.2$ cat bin/hoge.sh #!/bin/bash basename ${0} sh-3.2$ ls -l bin/hoge.sh -rw-r--r-- 1 oresama oresama 26 May 11 15:33 bin/hoge.sh sh-3.2$ hoge.sh sh: /home/oresama/bin/hoge.sh: Permission denied インターリンク株式会社
  19. 19. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ シェルスクリプトを実行するには2つの方法があります。 sh-3.2$ cat bin/hoge.sh #!/bin/bash 実行権をつける basename ${0} sh-3.2$ chmod 755 bin/hoge.sh sh-3.2$ ls -l bin/hoge.sh -rwxr-xr-x 1 oresama oresama 26 May 11 15:33 bin/hoge.sh sh-3.2$ hoge.sh hoge.sh インターリンク株式会社
  20. 20. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ シェルスクリプトを実行するには2つの方法があります。 sh-3.2$ cat bin/hoge.sh #!/bin/bash basename ${0} 実行権 (x) がついていない sh-3.2$ ls -l bin/hoge.sh -rw-r--r-- 1 oresama oresama 26 May 11 15:33 bin/hoge.sh sh-3.2$ sh hoge.sh hoge.sh インターリンク株式会社
  21. 21. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 2 出力結果をリダイレクトする際のお約束 シェルスクリプトの出力結果は、標準出力または標準エラー出力 に表示されます。ファイルやコマンドにリダイレクトしない場合は、コ ンソールやSSHクライアントに表示されます。 シェルスクリプトのリダイレクトは、主に次の3つを使います。 インターリンク株式会社
  22. 22. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ | 「パイプ」と呼ばれる。パイプ左辺で実行されたコマンドを パイプ右辺のコマンドへ渡す役割を担う。 > hoge.sh > file.txt と実行することにより、出力結果 が file.txt に上書きされる。 >> hoge.sh >> file.txt と実行することにより、出力結 果が file.txt に追記される。 インターリンク株式会社
  23. 23. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 3 他コマンドの出力結果を取り込む際のお約束 シェルスクリプトでは、他のコマンドを実行した結果を取り込むこと ができます。スクリプト内でコマンドを「``」で囲むか「$()」で囲むこと で実現できます。 例 #!/bin/sh echo "`date +%Y/%m/%d` $(uptime) " インターリンク株式会社
  24. 24. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 4 変数を設定する際のお約束 シェルスクリプトで変数を設定する際、以下の文法で行います。 hoge=fuga ※ 「=」の両側にスペースをあけないでください インターリンク株式会社
  25. 25. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 変数に格納された値を参照する際、変数の先頭に「$」をつけます。 sh-3.2$ hoge=fuga sh-3.2$ echo ${hoge} fuga インターリンク株式会社
  26. 26. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ ※ シェル変数について シェルスクリプト中で使うと便利な変数を、 付録「付帯資料 #1 シェル変数」にまとめました。 スクリプト名などを決め打ちで書くよりも 保守性が高くなりますので、非常に便利です。 インターリンク株式会社
  27. 27. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 簡単な実例 インターリンク株式会社
  28. 28. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ example1 「CentOSでrpmパッケージの更新をyumコマンドで確認し、その結 果をroot宛にメールする」 インターリンク株式会社
  29. 29. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ example1 sh-3.2$ cat bin/yum-check 先頭行に「シバン(shebang)」を書き 「これから書くスクリプトは、bashで動 きます」と宣言します。 #!/bin/bash /usr/bin/yum check-update | ¥ mail -s " `uname -n` `date` YUM CHECK " root@localhost インターリンク株式会社
  30. 30. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ example1 sh-3.2$ cat bin/yum-check yumコマンドの「check-update」オプ ションで、既に゗ンストールされている パッケージがupdateリポジトリにあるか 確認する #!/bin/bash /usr/bin/yum check-update | ¥ mail -s " `uname -n` `date` YUM CHECK " root@localhost インターリンク株式会社
  31. 31. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ example1 sh-3.2$ cat bin/yum-check yum check-updateコマンドで取得した ゕップデート有無結果を次のmailコマン ドに渡しています #!/bin/bash /usr/bin/yum check-update | ¥ mail -s " `uname -n` `date` YUM CHECK " root@localhost インターリンク株式会社
  32. 32. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ example1 sh-3.2$ cat bin/yum-check コマンドの1行が長くなる場合、「¥」で 折り返すことができます #!/bin/bash /usr/bin/yum check-update | ¥ mail -s " `uname -n` `date` YUM CHECK " root@localhost インターリンク株式会社
  33. 33. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ example1 sh-3.2$ cat bin/yum-check バッククォートで文字列をくくると、そ の中をコマンドとして実行し、標準出力 に出力されます #!/bin/bash /usr/bin/yum check-update | ¥ mail -s " `uname -n` `date` YUM CHECK " root@localhost インターリンク株式会社
  34. 34. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ example1 sh-3.2$ cat bin/yum-check バッククォートで文字列をくくると、そ の中をコマンドとして実行し、標準出力 に出力されます #!/bin/bash /usr/bin/yum check-update | ¥ mail -s " `uname -n` `date` YUM CHECK " root@localhost インターリンク株式会社
  35. 35. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ example2 「CentOSでrpmパッケージの更新をyumコマンドで確認し、その結 果をログファイルに残す」 インターリンク株式会社
  36. 36. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ example2 sh-3.2$ cat bin/yum-check2 ここで環境変数を指定しています。 ${HOME} とは、/etc/passwd フゔ゗ルに #!/bin/bash 書かれている、ユーザのホームデゖレク LOGDIR=${HOME}/logs トリを指しています。 /usr/bin/yum check-update >> ¥ ${LOGDIR}/$(date +%Y-%m-%d-%H-%M-%S)_$(basename ${0}).log インターリンク株式会社
  37. 37. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ example2 sh-3.2$ cat bin/yum-check2 「>>」により、yum check-update の結 #!/bin/bash 果をフゔ゗ルにリダ゗レクトされます LOGDIR=${HOME}/logs /usr/bin/yum check-update >> ¥ ${LOGDIR}/$(date +%Y-%m-%d-%H-%M-%S)_$(basename ${0}).log インターリンク株式会社
  38. 38. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ example2 sh-3.2$ cat bin/yum-check2 「$( )」で囲まれたコマンド実行結果を #!/bin/bash フゔ゗ル名にします LOGDIR=${HOME}/logs /usr/bin/yum check-update >> ¥ ${LOGDIR}/$(date +%Y-%m-%d-%H-%M-%S)_$(basename ${0}).log インターリンク株式会社
  39. 39. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ でも、よくわかんないですよね? インターリンク株式会社
  40. 40. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ example2 sh-3.2$ cat bin/yum-check2 #!/bin/bash この辺とか LOGDIR=${HOME}/logs /usr/bin/yum check-update >> ¥ ${LOGDIR}/$(date +%Y-%m-%d-%H-%M-%S)_$(basename ${0}).log インターリンク株式会社
  41. 41. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ example2 sh-3.2$ cat bin/yum-check2 #!/bin/bash この辺とか LOGDIR=${HOME}/logs /usr/bin/yum check-update >> ¥ ${LOGDIR}/$(date +%Y-%m-%d-%H-%M-%S)_$(basename ${0}).log インターリンク株式会社
  42. 42. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ こういうときは、バッククォートや $( ) に囲まれたコマンドをじっくり 観察します インターリンク株式会社
  43. 43. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ example2-2 解説 (dateコマンド出力例) sh-3.2$ date +%Y-%m-%d-%H-%M-%S 2011-04-24-08-40-48 コマンドをバッククォートで囲むこ %Y 4桁の西暦 とで、その部分は実行結果に置き換 わることは先ほど説明しました。 %m ゼロパディングされた月 ここでは、dateコマンドのオプショ %d ゼロパディングされた日付 ンを見てみましょう。右の表にある %H ゼロパディングされた時間(24h) 以外にもオプションはあるので、 「man date」コマンドを実行して %M ゼロパディングされた分 その他のオプションも応用してみる のもよいでしょう。 %S ゼロパディングされた秒 インターリンク株式会社
  44. 44. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ example2-3 解説 (basenameコマンドを使ってみる例 1) 変数 ${HOME} は /home/test1 というディレクトリ名に 展開される catコマンドで シェルスクリプトの 中身を見てみる シェルスクリプト「hoge」を 実行すると、画面に 「hoge」と表示される インターリンク株式会社
  45. 45. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ example2-3 解説 (basenameコマンドを使ってみる例 2) hoge を fuga に リネームしてみる catコマンドで シェルスクリプトの 中身を見てみる シェルスクリプト「fuga」を 実行すると、画面に 「fuga」と表示される インターリンク株式会社
  46. 46. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ ここまでのまとめ インターリンク株式会社
  47. 47. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ インターリンク株式会社
  48. 48. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ みんな、わかったカナ? リンくまは、ちょっと 疲れちゃったなー。 少し休憩しようよー。 インターリンク株式会社
  49. 49. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 3-1. テキスト処理の効率化とログ解析サンプル インターリンク株式会社
  50. 50. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-1 テキスト処理の効率化とログ解析サンプル ~Apacheのゕクセスログを見てみよう~ インターリンク株式会社
  51. 51. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ シェルスクリプトは手軽にテキスト処 理を行うことができます。次のページ に示すコマンドを押さえておくことで、 多様な処理が可能になるでしょう。 インターリンク株式会社
  52. 52. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ cat 1つ または 複数のフゔ゗ルを出力する *grep パターンにマッチする行を表示する (grep egrep fgrep) head フゔ゗ルの先頭を表示する (標準で先頭10行) tail フゔ゗ルの末尾を表示する (標準で末尾10行) wc フゔ゗ルのバ゗ト数、単語数、行数を表示する sed 基本的なテキスト置換を行う awk テキスト整形、置換、計算など非常に多機能なスクリプト言語 cut テキストを切り出す sort 文字列をソートする uniq 連続する同じ行を1行にまとめる インターリンク株式会社
  53. 53. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-1-1 WEBサーバに接続しにきたクラ゗ゕント一覧を出力する sh-3.2$ cat bin/example1-1.sh 1 #!/bin/bash 2 3 LOGDIR=/home/logs/blogcube.info/nullpopopo 4 LOGFILE=${LOGDIR}/access_log 5 6 awk '{print $1}' ${LOGFILE} | sort | uniq -c | sort -n インターリンク株式会社
  54. 54. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-1-1 WEBサーバに接続しにきたクラ゗ゕント一覧を出力する スクリプト中で使っているコマンド awk # テキストの特定の列を抜き出す sort # テキストの並べかえを行う uniq # 重複を除外する インターリンク株式会社
  55. 55. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-1-1 WEBサーバに接続しにきたクラ゗ゕント一覧を出力する インターリンク株式会社
  56. 56. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-1-2 WEBサーバに接続しにきたクラ゗ゕントのトップ10を出力する sh-3.2$ cat bin/example1-2.sh 1 #!/bin/bash 2 3 LOGDIR=/home/logs/blogcube.info/nullpopopo 4 LOGFILE=${LOGDIR}/access_log 5 6 awk '{print $1}' ${LOGFILE} | sort | ¥ 7 uniq -c | sort -nr | head インターリンク株式会社
  57. 57. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-1-2 WEBサーバに接続しにきたクラ゗ゕントのトップ10を出力する スクリプト中で使っているコマンド awk # 特定の列を抜き出す sort # 並べかえを行う uniq # 重複を除外する head # 先頭行を表示する インターリンク株式会社
  58. 58. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-1-2 WEBサーバに接続しにきたクラ゗ゕントのトップ10を出力する インターリンク株式会社
  59. 59. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-1-3 人気コンテンツのトップ10を出力する sh-3.2$ cat bin/example1-3.sh 1 #!/bin/bash 2 3 LOGDIR=/home/logs/blogcube.info/nullpopopo 4 LOGFILE=${LOGDIR}/access_log 5 6 awk '{print $7}' ${LOGFILE} | sort | ¥ 7 uniq -c | sort -nr | head インターリンク株式会社
  60. 60. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-1-3 人気コンテンツのトップ10を出力する スクリプト中で使っているコマンド awk # 特定の列を抜き出す sort # 並べかえを行う uniq # 重複を除外する head # 先頭行を表示する インターリンク株式会社
  61. 61. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-1-3 人気コンテンツのトップ10を出力する インターリンク株式会社
  62. 62. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-1-4 人気コンテンツのトップ10を出力する (重複対応版) sh-3.2$ cat bin/example1-4.sh 1 #!/bin/bash 2 3 LOGDIR=/home/logs/blogcube.info/nullpopopo 4 LOGFILE=${LOGDIR}/access_log 5 6 awk '{print $7}' ${LOGFILE} | sed -e 's/¥?.*//g' | ¥ 7 sort | uniq -c | sort -nr | head インターリンク株式会社
  63. 63. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-1-4 人気コンテンツのトップ10を出力する (重複対応版) スクリプト中で使っているコマンド sed # 文字列を置換する awk # 特定の列を抜き出す sort # 並べかえを行う uniq # 重複を除外する head # 先頭行を表示する インターリンク株式会社
  64. 64. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-1-4 人気コンテンツのトップ10を出力する (重複対応版) インターリンク株式会社
  65. 65. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-1-4 人気コンテンツのトップ10を出力する (重複対応版) 重複対応版では sed -e 's/¥?.*//g' という処理を入れてい ることで、URLの後ろにくっついている?以降の文字列 を正規表現で削除し、同じURLとしてカウントします。 例) http://nullpopopo.blogcube.info/ http://nullpopopo.blogcube.info/?p=142 インターリンク株式会社
  66. 66. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-1-5 人気コンテンツのトップ10を出力する (重複対応・拡張子指定版) sh-3.2$ cat bin/example1-5.sh 1 #!/bin/bash 2 3 LOGDIR=/home/logs/blogcube.info/nullpopopo 4 LOGFILE=${LOGDIR}/access_log 5 6 awk '{print $7}' ${LOGFILE} | sed -e 's/¥?.*//g' | ¥ 7 egrep -iv '(js$|xml$|jpg$|gif$|png$|css$|ico$|robots.txt$)' | ¥ 8 sort | uniq -c | sort -nr | head インターリンク株式会社
  67. 67. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-1-5 人気コンテンツのトップ10を出力する (重複対応・拡張子指定版) スクリプト中で使っているコマンド awk # 特定の列を抜き出す egrep # 特定文字列を含む行を抜き出す sort # 並べかえを行う uniq # 重複を除外する head # 先頭行を表示する インターリンク株式会社
  68. 68. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-1-5 人気コンテンツのトップ10を出力する (重複対応・拡張子指定版) インターリンク株式会社
  69. 69. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-1-5 人気コンテンツのトップ10を出力する (重複対応・拡張子指定版) 重複対応・拡張子指定版では egrep -iv '(js$|xml$|jpg$|gif$|png$|css$|ico$|robots.txt$)' とい う処理を入れていることで、拡張子がjsで終わるもの、 xmlで終わるもの、以下、JPG、GIF、PNG、CSS、ICO、 そしてrobots.txtを大文字小文字関係なしに除外していま す。 egrep -i ~~~ ※ 大文字小文字を問わない egrep -v ~~~ ※ 引数に与えられた文字列を除外する インターリンク株式会社
  70. 70. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 3-2. 簡単なルーチンワークと監視プログラム インターリンク株式会社
  71. 71. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2 簡単なルーチンワークと監視プログラム ~サーバの監視をしてみよう~ インターリンク株式会社
  72. 72. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-1 デゖスク容量を監視し、CSVフゔ゗ルへ記録する sh-3.2$ cat bin/DFCSV 1 #!/bin/bash 2 LOGDATE=$(/bin/date '+%Y¥/%m¥/%d %H:%M:%S') 3 LOGDIR=${HOME}/logs 4 LOGFILE=${LOGDIR}/$(basename${0})_$(date +%Y%m%d).csv 5 6 df -kP | egrep -v '(^Filesystem|/dev/shm$)' | ¥ 7 sed -e "s/^/$(echo ${LOGDATE}) /g;s/¥s¥s*/,/g" >> ¥ 8 ${LOGFILE} インターリンク株式会社
  73. 73. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-1 デゖスク容量を監視し、CSVフゔ゗ルへ記録する スクリプト中で使っているコマンド basename # コマンドのフルパスから デゖレクトリを除いて表示する date # 時刻を表示する df # デゖスク容量を表示する egrep # 特定文字列を含む行を抜き出す sed # 文字列を置換する インターリンク株式会社
  74. 74. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-1 デゖスク容量を監視し、CSVフゔ゗ルへ記録する LOGDATE=$(/bin/date '+%Y¥/%m¥/%d %H:%M:%S') 変数「LOGDATE」に、dateコマンドで YYYY/MM/DD HH:MM:SS 形式の日付を代入 します。実際にコンソール上で「/bin/date '+%Y¥/%m¥/%d %H:%M:%S'」を実行して みることで、どのように出力されるか事前に確認するとよいでしょう。 例) sh-3.2$ /bin/date '+%Y¥/%m¥/%d %H:%M:%S' 2011¥/05¥/22 22:57:48 インターリンク株式会社
  75. 75. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-1 デゖスク容量を監視し、CSVフゔ゗ルへ記録する LOGDIR=${HOME}/logs 変数「LOGDIR」には、シェル変数「${HOME}/logs」が代入されます。変数${HOME} に何が代入されるかは、以下のコマンドで確認することができます。 例) sh-3.2$ echo ${HOME} /home/oresama インターリンク株式会社
  76. 76. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-1 デゖスク容量を監視し、CSVフゔ゗ルへ記録する LOGFILE=${LOGDIR}/$(basename ${0})_$(date +%Y%m%d).csv 変数「LOGDIR」は、/home/oresama/logs デゖレクトリであることがわかりました。 変数「$(basename ${0})」は、実行したスクリプト自身の名前になります。 basename コマンドをつけているのは、「sh DFCSV 」で実行した際に、意図せぬ フゔ゗ル名にならないようにするためです。スクリプトの名前が 「DFCSV」だとして、ログフゔ゗ルは以下に出力されます。 /home/oresama/logs/DFCSV_20110529.csv インターリンク株式会社
  77. 77. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-1 デゖスク容量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (df) dfコマンドのオプションは以下の通りです。 -k 容量をキロバ゗ト単位で表示する。 フゔ゗ルシステムの情報を常に1行で表示させるため、POSIX出力形式を用 -P いる。LVMのボリューム配下やNFSマウントされている領域で改行されない。 インターリンク株式会社
  78. 78. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-1 デゖスク容量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (df) - 出力例 sh-3.2$ df -kP Filesystem 1024-blocks Used Available Capacity Mounted on /dev/mapper/VolGroup00-LogVol00 519423712 159664828 332948108 33% / /dev/vda1 101086 33062 62805 35% /boot tmpfs 254632 0 254632 0% /dev/shm インターリンク株式会社
  79. 79. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-1 デゖスク容量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (df) - 出力例 sh-3.2$ df -k Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/VolGroup00-LogVol00 519423712 159664828 332948108 33% / /dev/vda1 101086 33062 62805 35% /boot tmpfs 254632 0 254632 0% /dev/shm インターリンク株式会社
  80. 80. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-1 デゖスク容量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (egrep) egrep -v '(^Filesystem|/dev/shm$)' で、先頭が「 Filesystem」の行と「/dev/shm」で終わる行を表示しないようにしてい ます。 インターリンク株式会社
  81. 81. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-1 デゖスク容量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (egrep) - 出力例 sh-3.2$ df -kP | egrep -v '(^Filesystem|/dev/shm$)' /dev/mapper/VolGroup00-LogVol00 519423712 159664892 332948044 33% / /dev/vda1 101086 33062 62805 35% /boot インターリンク株式会社
  82. 82. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-1 デゖスク容量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (sed) sed -e "s/^/$(echo ${LOGDATE}) /g;s/¥s¥s*/,/g" で、先頭出力結果の先頭を日付に、連続したスペースをカンマに置換しています。 複数回のsedは、以下のようにまとめることができます。 sed -e "s/hoge/fuga/g;s/ABC/DEF/g" ( sed -e "s/hoge/fuga/g" | sed -e "s/ABC/DEF/g" と同じ出力結果) インターリンク株式会社
  83. 83. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-1 デゖスク容量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (sed) - 出力例 sh-3.2$ df -kP | egrep -v '(^Filesystem|/dev/shm$)' | ¥ > sed -e "s/^/$(/bin/date '+%Y¥/%m¥/%d %H:%M:%S') /g;s/¥s¥s*/,/g" 2011/05/22,23:58:13,/dev/mapper/VolGroup00-LogVol00,519423712,159664920,332948016,33%,/ 2011/05/22,23:58:13,/dev/vda1,101086,33062,62805,35%,/boot インターリンク株式会社
  84. 84. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-1 デゖスク容量を監視し、CSVフゔ゗ルへ記録する ログ(CSVフゔ゗ル) 出力例 インターリンク株式会社
  85. 85. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-2 メモリ使用量を監視し、CSVフゔ゗ルへ記録する sh-3.2$ cat bin/FREECSV (前半) 1 #!/bin/bash 2 LOGDATE=$(/bin/date '+%Y¥/%m¥/%d %H:%M:%S') 3 LOGDIR=${HOME}/logs 4 LOGFILE=${LOGDIR}/$(basename${0})_$(date +%Y%m%d).csv 5 6 FKMEM=$(free -k | egrep '(^Mem)' | awk '{print $1,$2}') 7 FKPLM=$(free -k | egrep '(^-/+)' | awk '{print $3,$4}') 8 インターリンク株式会社
  86. 86. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-2 メモリ使用量を監視し、CSVフゔ゗ルへ記録する sh-3.2$ cat bin/FREECSV (後半) 9 free -k | egrep '(^Mem:)' | awk '{print $1,$2,$3,$4,$5,$6,$7}' | ¥ 10 sed -e "s/^/$(echo ${LOGDATE}) /g;s/¥s¥s*/,/g" >> ${LOGFILE} 11 12 free -k | egrep '(^Swap:)' | awk '{print $1,$2,$3,$4}' | ¥ 13 sed -e "s/^/$(echo ${LOGDATE}) /g;s/¥s¥s*/,/g" >> ${LOGFILE} 14 15 echo $(echo -n ${FKMEM} ; echo ${FKPLM} | sed -e s/^/" "/g) | ¥ 16 sed -e "s/^/$(echo ${LOGDATE}) /g;s/Mem/Total/g;s/¥s¥s*/,/g" >> ${LOGFILE} インターリンク株式会社
  87. 87. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-2 メモリ使用量を監視し、CSVフゔ゗ルへ記録する スクリプト中で使っているコマンド date # 時刻を表示する basename # コマンドのフルパスから デゖレクトリを除いて表示する free # メモリ使用量を表示する egrep # 特定文字列を含む行を抜き出す awk # 特定の列を抜き出す echo # 文字列を表示する インターリンク株式会社
  88. 88. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-2 メモリ使用量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (free -k) - 出力例 sh-3.2$ free -k total used free shared buffers cached Mem: 509268 356712 152556 0 35864 233108 -/+ buffers/cache: 87740 421528 Swap: 524280 68 524212 インターリンク株式会社
  89. 89. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-2 メモリ使用量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (awkで実メモリの表示行を抜き出す) - 出力例 sh-3.2$ LOGDATE=$(/bin/date '+%Y¥/%m¥/%d %H:%M:%S') sh-3.2$ free -k | egrep '(^Mem:)' | awk '{print $1,$2,$3,$4,$5,$6,$7}' | ¥ > sed -e "s/^/$(echo ${LOGDATE}) /g;s/¥s¥s*/,/g" 2011/05/29,12:39:26,Mem:,509268,351732,157536,0,31228,232560 インターリンク株式会社
  90. 90. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-2 メモリ使用量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (awkでSWAPの行を抜き出す) - 出力例 sh-3.2$ LOGDATE=$(/bin/date '+%Y¥/%m¥/%d %H:%M:%S') sh-3.2$ free -k | egrep '(^Swap:)' | awk '{print $1,$2,$3,$4}' | ¥ > sed -e "s/^/$(echo ${LOGDATE}) /g;s/¥s¥s*/,/g" 2011/05/29,13:51:35,Swap:,524280,68,524212 インターリンク株式会社
  91. 91. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-2 メモリ使用量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (メモリの実質消費量 ※別途資料参照) - 出力例 sh-3.2$ LOGDATE=$(/bin/date '+%Y¥/%m¥/%d %H:%M:%S') sh-3.2$ FKMEM=$(free -k | egrep '(^Mem)' | awk '{print $1,$2}') sh-3.2$ FKPLM=$(free -k | egrep '(^-/+)' | awk '{print $3,$4}') sh-3.2$ echo $(echo -n ${FKMEM} ; echo ${FKPLM} | sed -e s/^/" "/g) | ¥ > sed -e "s/^/$(echo ${LOGDATE}) /g;s/Mem/Total/g;s/¥s¥s*/,/g" 2011/05/29,13:59:03,Total:,509268,88128,421140 インターリンク株式会社
  92. 92. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-2 メモリ使用量を監視し、CSVフゔ゗ルへ記録する 変数解説 - FKMEM - sh-3.2$ FKMEM=$(free -k | egrep '(^Mem)' | awk '{print $1,$2}') sh-3.2$ echo ${FKMEM} Mem: 509268 freeコマンドの出力結果より、実メモリの総容量(egrepで先頭 がMemである行)を抜き出し、1フゖールド目と2フゖールド目を 切り出した結果。 ゗ンターリンク株式会社
  93. 93. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-2 メモリ使用量を監視し、CSVフゔ゗ルへ記録する 変数解説 - FKPLM - sh-3.2$ FKPLM=$(free -k | egrep '(^-/+)' | awk '{print $3,$4}') sh-3.2$ echo ${FKPLM} 88268 421000 freeコマンドの出力結果より、メモリの「usedからバッフゔ キャッシュ( buffers )・フゔ゗ルキャッシュ( cached )を差し 引いた量(内容を捨てるわけにいかないメモリ)と、freeにバッ フゔキャッシュ・フゔ゗ルキャッシュを加えた量(必要があれ ば使えるメモリ)を切り出した結果。 インターリンク株式会社
  94. 94. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-2 メモリ使用量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (メモリの実質消費量ログフゔ゗ル) - 出力例 sh-3.2$ grep Total ${HOME}/logs/FREECSV_20110529.csv | tail 2011/05/29,13:35:01,Total:,509268,91380,417888 2011/05/29,13:40:02,Total:,509268,90864,418404 実メモリ総容量 2011/05/29,13:45:01,Total:,509268,90244,419024 2011/05/29,13:50:01,Total:,509268,88956,420312 2011/05/29,13:55:01,Total:,509268,88848,420420 2011/05/29,14:00:02,Total:,509268,89196,420072 2011/05/29,14:05:01,Total:,509268,91280,417988 2011/05/29,14:10:02,Total:,509268,89772,419496 2011/05/29,14:15:01,Total:,509268,90088,419180 2011/05/29,14:20:01,Total:,509268,92896,416372 インターリンク株式会社
  95. 95. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-2 メモリ使用量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (メモリの実質消費量ログフゔ゗ル) - 出力例 sh-3.2$ grep Total ${HOME}/logs/FREECSV_20110529.csv | tail 2011/05/29,13:35:01,Total:,509268,91380,417888 2011/05/29,13:40:02,Total:,509268,90864,418404 2011/05/29,13:45:01,Total:,509268,90244,419024 2011/05/29,13:50:01,Total:,509268,88956,420312 2011/05/29,13:55:01,Total:,509268,88848,420420 メモリ使用量 ※ バッフゔとキャッシュを含まず 2011/05/29,14:00:02,Total:,509268,89196,420072 2011/05/29,14:05:01,Total:,509268,91280,417988 2011/05/29,14:10:02,Total:,509268,89772,419496 2011/05/29,14:15:01,Total:,509268,90088,419180 2011/05/29,14:20:01,Total:,509268,92896,416372 インターリンク株式会社
  96. 96. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-2 メモリ使用量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (メモリの実質消費量ログフゔ゗ル) - 出力例 sh-3.2$ grep Total ${HOME}/logs/FREECSV_20110529.csv | tail 2011/05/29,13:35:01,Total:,509268,91380,417888 2011/05/29,13:40:02,Total:,509268,90864,418404 2011/05/29,13:45:01,Total:,509268,90244,419024 2011/05/29,13:50:01,Total:,509268,88956,420312 2011/05/29,13:55:01,Total:,509268,88848,420420 2011/05/29,14:00:02,Total:,509268,89196,420072 2011/05/29,14:05:01,Total:,509268,91280,417988 2011/05/29,14:10:02,Total:,509268,89772,419496 空きメモリ 2011/05/29,14:15:01,Total:,509268,90088,419180 ※ バッフゔとキャッシュを含む 2011/05/29,14:20:01,Total:,509268,92896,416372 インターリンク株式会社
  97. 97. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-3 ロードゕベレージを監視し、CSVフゔ゗ルへ記録する sh-3.2$ cat bin/LACSV 1 #!/bin/bash 2 LOGDATE=$(/bin/date '+%Y¥/%m¥/%d %H:%M:%S') 3 LOGDIR=${HOME}/logs 4 LOGFILE=${LOGDIR}/$(basename${0})_$(date +%Y%m%d).csv 5 6 uptime | awk 'BEGIN {FS="load average:"} {print $NF}' | ¥ 7 sed -e "s/^/$(echo ${LOGDATE}) /g;s/¥s¥s*/,/g;s/,,/,/g" >> ${LOGFILE} インターリンク株式会社
  98. 98. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-3 ロードゕベレージを監視し、CSVフゔ゗ルへ記録する スクリプト中で使っているコマンド date # 時刻を表示する basename # コマンドのフルパスから デゖレクトリを除いて表示する uptime # コンピュータの起動経過時刻を表示する awk # 特定の列を抜き出す sed # 文字列を置換する インターリンク株式会社
  99. 99. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-3 ロードゕベレージを監視し、CSVフゔ゗ルへ記録する コマンド解説 (uptimeコマンド) - 出力例 sh-3.2$ uptime 15:51:53 up 20 days, 14:22, 1 user, load average: 0.07, 0.09, 0.08 コマンド解説 (uptimeコマンドからロードゕベレージを抜き出す) - 出力例 sh-3.2$ uptime | awk 'BEGIN {FS="load average:"} {print $NF}' 0.07, 0.09, 0.08 インターリンク株式会社
  100. 100. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-3 ロードゕベレージを監視し、CSVフゔ゗ルへ記録する コマンド解説 (uptimeコマンド) - 出力例 sh-3.2$ uptime 15:51:53 up 20 days, 14:22, 1 user, load average: 0.07, 0.09, 0.08 コマンド解説 (uptimeコマンドからロードゕベレージを抜き出す) - 出力例 sh-3.2$ uptime | awk 'BEGIN {FS="load average:"} {print $NF}' 文字列 最後のフゖールドを 「load average:」を 0.07, 0.09, 0.08 表示する 区切り文字に指定する インターリンク株式会社
  101. 101. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-3 ロードゕベレージを監視し、CSVフゔ゗ルへ記録する コマンド解説 (メモリの実質消費量ログフゔ゗ル) - 出力例 sh-3.2$ tail ${HOME}/logs/LACSV_20110529.csv 2011/05/29,18:00:01,0.56,0.17,0.11 1分間の run queue(CPUに割り当て 2011/05/29,18:05:01,0.58,0.19,0.12 られたジョブが入る待ち行列)にある 2011/05/29,18:10:02,0.64,0.19,0.12 ジョブ数平均値 2011/05/29,18:15:01,0.40,0.15,0.10 2011/05/29,18:20:02,0.72,0.20,0.12 2011/05/29,18:25:02,0.56,0.18,0.11 2011/05/29,18:30:02,0.51,0.19,0.12 2011/05/29,18:35:01,0.48,0.17,0.11 2011/05/29,18:40:02,0.56,0.17,0.11 2011/05/29,18:45:01,0.49,0.16,0.11 インターリンク株式会社
  102. 102. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-3 ロードゕベレージを監視し、CSVフゔ゗ルへ記録する コマンド解説 (メモリの実質消費量ログフゔ゗ル) - 出力例 sh-3.2$ tail ${HOME}/logs/LACSV_20110529.csv 2011/05/29,18:00:01,0.56,0.17,0.11 2011/05/29,18:05:01,0.58,0.19,0.12 2011/05/29,18:10:02,0.64,0.19,0.12 2011/05/29,18:15:01,0.40,0.15,0.10 5分間の run queue(CPUに割り当て 2011/05/29,18:20:02,0.72,0.20,0.12 られたジョブが入る待ち行列)にある 2011/05/29,18:25:02,0.56,0.18,0.11 ジョブ数平均値 2011/05/29,18:30:02,0.51,0.19,0.12 2011/05/29,18:35:01,0.48,0.17,0.11 2011/05/29,18:40:02,0.56,0.17,0.11 2011/05/29,18:45:01,0.49,0.16,0.11 インターリンク株式会社
  103. 103. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-3 ロードゕベレージを監視し、CSVフゔ゗ルへ記録する コマンド解説 (メモリの実質消費量ログフゔ゗ル) - 出力例 sh-3.2$ tail ${HOME}/logs/LACSV_20110529.csv 2011/05/29,18:00:01,0.56,0.17,0.11 2011/05/29,18:05:01,0.58,0.19,0.12 2011/05/29,18:10:02,0.64,0.19,0.12 2011/05/29,18:15:01,0.40,0.15,0.10 2011/05/29,18:20:02,0.72,0.20,0.12 2011/05/29,18:25:02,0.56,0.18,0.11 2011/05/29,18:30:02,0.51,0.19,0.12 2011/05/29,18:35:01,0.48,0.17,0.11 15分間の run queue(CPUに割り当て 2011/05/29,18:40:02,0.56,0.17,0.11 られたジョブが入る待ち行列)にある 2011/05/29,18:45:01,0.49,0.16,0.11 ジョブ数平均値 インターリンク株式会社
  104. 104. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ sample3-2-3 ロードゕベレージを監視し、CSVフゔ゗ルへ記録する ログ(CSVフゔ゗ル) 出力例 インターリンク株式会社
  105. 105. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 課題 インターリンク株式会社
  106. 106. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 1 同じ列に複数の項目が並んでいるので、DFCSVや FREECSVをグラフ化するのが面倒 だ。 2 *CSVスクリプトでほとんどの変数が共通なので、 これらを関数化できないか? 3 監視項目の閾値を超えたときにメール発報したい。 4 ログの先頭に項目名をつけたい。 インターリンク株式会社
  107. 107. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ シェルスクリプトがわかってくると、 こうした悩みが出てくるよね? 次回は、if文 (条件分岐) や for文 (繰返し) 、 関数を使ってスマートなスクリプトを書いて みよう! インターリンク株式会社
  108. 108. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 4. 質疑応答 インターリンク株式会社
  109. 109. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ ご清聴有難うございました。 インターリンク株式会社

×