狠狠撸

狠狠撸Share a Scribd company logo
さわって☆ドキドキ。
こんなに素敵?なシェルスクリプト。

(注:登壇者が考えたタイトルではありません!!)

      鲍厂笔研究所 上田隆一
発表内容
 ●   シェルスクリプトを何に使う?
 ●   シェルスクリプトは本当に素敵なのか?
 ●   便利なコマンドを公開
      ●   Open usp Tukubai
 ●   まとめ




Mar. 16, 2012        Open Source Conference 2012 Tokyo/Spring   2
「シェルスクリプト」何に使う?
●   Facebookで聞いてみた
    ●   上位
         –   定型処理の自動化
         –   バックアップ
         –   その場限りのデータ集計
         –   スタートスクリプト作成
         –   いたずら

    ●   どちらかというと
         –   ちょっとしたもの、あるいはシステム寄り
Mar. 16, 2012         Open Source Conference 2012 Tokyo/Spring   3
USP研究所の「シェルスクリプト」
●    アプリケーション寄り
      ●   バッチデータ処理
      ●   帳票を作る
           –   データからpdfやexcel、グラフを作る
      ●   CGIスクリプト
           –   bashCMS(社員作)



      ●   世間とのギャップが激しい

    Mar. 16, 2012      Open Source Conference 2012 Tokyo/Spring   4
ごく大雑把なギャップの分析
                                 法人?仕事


                COBOL                            シェルスクリプト
                                                 (USP研究所)
                                                                   Java
                                                                          フロント
 バック                                                    Python PHP        エンド?
 エンド
                          データベース                                          web
                                                                   Ruby
                シェル       (RDBMS)
                スクリプト
                (一般)
                           個人、趣味、ベンチャー
  ●   とにかくRDBMS(以後単にDBと表記)にデータを突っ込む →
      シェルスクリプトの出る幕なし
Mar. 16, 2012           Open Source Conference 2012 Tokyo/Spring             5
「なんでもDB」でいいのか?
 ●   よい。それは否定しなくてよい。
      ●   もうSQLに慣れた。誰でも慣れたツールを使いたい
      ●   いたれりつくせり(排他など)
      ●   Webとのつなぎが簡単
 ●   しかし、
      ●   手元のデータをもっと手軽にハンドリングできれば
          そっちも使ってよいだろう。そんな方法があれば。
      ●   (言語にこだわる人がSQLを手放しで受け入れるのは解せない)


Mar. 16, 2012     Open Source Conference 2012 Tokyo/Spring   6
シェルスクリプトにも問題
 ●   モダンな言語に比べて制御構文が読みにくい
      ●   If [ 3 -lt “${A}” -a 5 -gt “{B}” -o “${HOGE}” = “HOGE” ]
      ●   ↑読めん。読む気がしない

 ●   気が利かない
      ●   これをしたいのに、このコマンドがない
           -> シェル文法地獄 -> 詰んだ!

           ※コマンドが揃ってのシェルスクリプト!!
Mar. 16, 2012             Open Source Conference 2012 Tokyo/Spring   7
コマンドがあると無いで大違い1
 ●   例:自然数を読んで偶数だけ出力
      ●   こんなことをしてはいけません
           –    注:コマンドの使用が制限されている状況は除く
                #!/bin/bash
                while read n ; do
                      if [ $((n%2)) -eq 0 ] ; then
                             echo $n
                      fi
                done

      ●   コマンドの力を借りると制御構文が無くなる
           –    awk '$1%2==0' < /dev/stdin
           –    grep “[02468]$” < /dev/stdin
Mar. 16, 2012                    Open Source Conference 2012 Tokyo/Spring   8
コマンドがあると無いで大違い2
 ●   これはどうか?詰んではいないが???
      ●   1月の日付を列挙する
                #!/bin/bash
                n=20120101
                while [ $n -lt 20120201 ] ; do
                      echo $n
                      n=$(date -d "$n 1 day" +%Y%m%d)
                done
      ●   これは代替の方法を考えるのが大変だ

       便利なコマンドがあればいいな!!!
Mar. 16, 2012         Open Source Conference 2012 Tokyo/Spring   9
Open usp Tukubai
●   フリーのコマンド群
      ●   USP研究所が使っているものの一部を書き直し
           –   Pythonで短く
           –   MITライセンス
      ●   コマンド
           –   cgi-name, check_attr_name, check_need_name, comma,
               count, ctail, delf, divsen, getfirst, getlast, gyo, han, join0, join1,
               join2, juni, kasan, keta, keycut, loopj, loopx, map, marume,
               mdate, mime-read, mojihame, nameread, plus, rank, ratio,
               retu, self, sm2, sm4, sm5, tarr, tateyoko, tcat, unmap, up3,
               yarr, ycat, yobi, ysum, zen
           –   日本語名のコマンドがあるが、これを外国人に使わせるのが目標
    Mar. 16, 2012              Open Source Conference 2012 Tokyo/Spring          10
何ができるか
 ●   CUIでデータを扱う方法の延長
      ●   典型的な端末のファイル処理
           –    catでファイルをざっと閲覧、grepで行を抽出、
                sedで置換、sortでソート???

      ●   以下の機能をコマンドで付加する
           –    表計算
           –    リレーショナル演算
           –    その他便利機能(全角<->半角、四捨五入、カンマ打ち)


Mar. 16, 2012         Open Source Conference 2012 Tokyo/Spring   11
使ってみる1 --- han, zen
 ●   全角半角の混在
           $ cat phone-no
           001 067ー4321ー8834 志村県加藤市高木町1-9ー3
           002 0120-212ー212 仲本県碇谷群荒井町茶123ー21

 ●   「han」を使うと半角にできるものは半角に
                $ cat phone-no | han
                001 067?4321?8834 志村県加藤市高木町1-9?3
                002 0120-212?212 仲本県碇谷群荒井町茶123?21
 ●   住所の番地を全角に戻す
                $ cat phone-no | han | zen 3
                001 067?4321?8834 志村県加藤市高木町1-9ー3
                002 0120-212?212 仲本県碇谷群荒井町茶123ー21

Mar. 16, 2012            Open Source Conference 2012 Tokyo/Spring   12
使ってみる2 --- keta
 ●   列を揃える




          見づらい


                                                    見やすい
Mar. 16, 2012     Open Source Conference 2012 Tokyo/Spring   13
使ってみる3 --- join1
 ●   データの結合
         データ:http://www.pursue.ne.jp/jouhousyo/SQLDoc/select21.html
                売上データ                                    顧客データ
      $ cat uriage                            $ cat kokyaku
      1 2001/05/27 105                        101 二島商店
      2 2001/05/27 101                        102 姫路商事
      3 2001/05/27 103                        103 大阪物産
      4 2001/06/27 102                        104 神戸商店
      5 2001/06/27 104                        105 福岡商事
                                データを結合する
       $ sort -k3,3 uriage | join1 key=3 kokyaku - | sort
       1 2001/05/27 105 福岡商事
       2 2001/05/27 101 二島商店
       3 2001/05/27 103 大阪物産
       4 2001/06/27 102 姫路商事
       5 2001/06/27 104 神戸商店
Mar. 16, 2012               Open Source Conference 2012 Tokyo/Spring   14
使ってみる4 --- mdate, yobi
●   日付の列挙
    $ mdate -e 20120101 20120110
    20120101 20120102 20120103 20120104 20120105 20120106 20120107
    20120108 20120109 20120110

●   2月末日は?
    $ mdate 20120301/-1
    20120229
●   曜日をつける
    $ mdate -e 20120101 20120104 | tarr | yobi -j 1
    20120101 日
    20120102 月
    20120103 火
    20120104 水
Mar. 16, 2012             Open Source Conference 2012 Tokyo/Spring   15
使ってみる5 --- count, sm2
 ●   数え上げ         $ cat data
                  山田
                  山田
                  上田                                 $ sort data | count 1 1
                  山田                                 山田 4
                  山田                                 上田 2
                  上田

 ●   集計
                  $ cat data
                  001 23324
                  001 1235                           $ sm2 1 1 2 2 data
                  002 3243                           001 24559
                  002 -32345                         002 -29102
                  003 425                            003 392.65
                  003 0.15
                  003 -32.5

Mar. 16, 2012          Open Source Conference 2012 Tokyo/Spring                16
使ってみる6 --- webシステム
 ●   bashCMS
      ●   USP友の会のブースで展示。ソース見せます。




                                      http://www.usptomonokai.jp/
Mar. 16, 2012       Open Source Conference 2012 Tokyo/Spring        17
Open usp Tukubaiの入手 ---その1
●   FreeBSD ports
     ●   収録されました (/usr/ports/devel/open-usp-tukubai)
     ●   当面、portsnap extract または
         portsnap update で入手




                http://www.freshports.org/devel/open-usp-tukubai/
Mar. 16, 2012           Open Source Conference 2012 Tokyo/Spring    18
Open usp Tukubaiの入手 ---その2
●   github
      ●   Tukubaiで検索




            https://github.com/usp-engineers-community/Open-usp-Tukubai
    Mar. 16, 2012           Open Source Conference 2012 Tokyo/Spring      19
Open usp Tukubaiの入手 ---その3
 ●   UECサイト(usp engineers' community)
      ●   https://uec.usp-lab.com




Mar. 16, 2012         Open Source Conference 2012 Tokyo/Spring   20
まとめ
 ●   コマンドあってのシェルスクリプト
      ●   コマンドを使わないと素敵ではない
 ●   Open usp Tukubaiは便利
      ●   端末?シェルスクリプトをどんどん便利にする試み
      ●   FreeBSD, GitHub, uecサイトで入手可能

 ●   Software Design 連載もお願いします(17日発売)
      ●   開眼シェルスクリプト
           –    第4回:表とグラフを描く――HTMLファイルの出力
            –
Mar. 16, 2012         Open Source Conference 2012 Tokyo/Spring   21

           –

More Related Content

OSC2012 Tokyo Spring, USP lab. presentation

  • 2. 発表内容 ● シェルスクリプトを何に使う? ● シェルスクリプトは本当に素敵なのか? ● 便利なコマンドを公開 ● Open usp Tukubai ● まとめ Mar. 16, 2012 Open Source Conference 2012 Tokyo/Spring 2
  • 3. 「シェルスクリプト」何に使う? ● Facebookで聞いてみた ● 上位 – 定型処理の自動化 – バックアップ – その場限りのデータ集計 – スタートスクリプト作成 – いたずら ● どちらかというと – ちょっとしたもの、あるいはシステム寄り Mar. 16, 2012 Open Source Conference 2012 Tokyo/Spring 3
  • 4. USP研究所の「シェルスクリプト」 ● アプリケーション寄り ● バッチデータ処理 ● 帳票を作る – データからpdfやexcel、グラフを作る ● CGIスクリプト – bashCMS(社員作) ● 世間とのギャップが激しい Mar. 16, 2012 Open Source Conference 2012 Tokyo/Spring 4
  • 5. ごく大雑把なギャップの分析 法人?仕事 COBOL シェルスクリプト (USP研究所) Java フロント バック Python PHP エンド? エンド データベース web Ruby シェル (RDBMS) スクリプト (一般) 個人、趣味、ベンチャー ● とにかくRDBMS(以後単にDBと表記)にデータを突っ込む → シェルスクリプトの出る幕なし Mar. 16, 2012 Open Source Conference 2012 Tokyo/Spring 5
  • 6. 「なんでもDB」でいいのか? ● よい。それは否定しなくてよい。 ● もうSQLに慣れた。誰でも慣れたツールを使いたい ● いたれりつくせり(排他など) ● Webとのつなぎが簡単 ● しかし、 ● 手元のデータをもっと手軽にハンドリングできれば そっちも使ってよいだろう。そんな方法があれば。 ● (言語にこだわる人がSQLを手放しで受け入れるのは解せない) Mar. 16, 2012 Open Source Conference 2012 Tokyo/Spring 6
  • 7. シェルスクリプトにも問題 ● モダンな言語に比べて制御構文が読みにくい ● If [ 3 -lt “${A}” -a 5 -gt “{B}” -o “${HOGE}” = “HOGE” ] ● ↑読めん。読む気がしない ● 気が利かない ● これをしたいのに、このコマンドがない -> シェル文法地獄 -> 詰んだ! ※コマンドが揃ってのシェルスクリプト!! Mar. 16, 2012 Open Source Conference 2012 Tokyo/Spring 7
  • 8. コマンドがあると無いで大違い1 ● 例:自然数を読んで偶数だけ出力 ● こんなことをしてはいけません – 注:コマンドの使用が制限されている状況は除く #!/bin/bash while read n ; do if [ $((n%2)) -eq 0 ] ; then echo $n fi done ● コマンドの力を借りると制御構文が無くなる – awk '$1%2==0' < /dev/stdin – grep “[02468]$” < /dev/stdin Mar. 16, 2012 Open Source Conference 2012 Tokyo/Spring 8
  • 9. コマンドがあると無いで大違い2 ● これはどうか?詰んではいないが??? ● 1月の日付を列挙する #!/bin/bash n=20120101 while [ $n -lt 20120201 ] ; do echo $n n=$(date -d "$n 1 day" +%Y%m%d) done ● これは代替の方法を考えるのが大変だ 便利なコマンドがあればいいな!!! Mar. 16, 2012 Open Source Conference 2012 Tokyo/Spring 9
  • 10. Open usp Tukubai ● フリーのコマンド群 ● USP研究所が使っているものの一部を書き直し – Pythonで短く – MITライセンス ● コマンド – cgi-name, check_attr_name, check_need_name, comma, count, ctail, delf, divsen, getfirst, getlast, gyo, han, join0, join1, join2, juni, kasan, keta, keycut, loopj, loopx, map, marume, mdate, mime-read, mojihame, nameread, plus, rank, ratio, retu, self, sm2, sm4, sm5, tarr, tateyoko, tcat, unmap, up3, yarr, ycat, yobi, ysum, zen – 日本語名のコマンドがあるが、これを外国人に使わせるのが目標 Mar. 16, 2012 Open Source Conference 2012 Tokyo/Spring 10
  • 11. 何ができるか ● CUIでデータを扱う方法の延長 ● 典型的な端末のファイル処理 – catでファイルをざっと閲覧、grepで行を抽出、 sedで置換、sortでソート??? ● 以下の機能をコマンドで付加する – 表計算 – リレーショナル演算 – その他便利機能(全角<->半角、四捨五入、カンマ打ち) Mar. 16, 2012 Open Source Conference 2012 Tokyo/Spring 11
  • 12. 使ってみる1 --- han, zen ● 全角半角の混在 $ cat phone-no 001 067ー4321ー8834 志村県加藤市高木町1-9ー3 002 0120-212ー212 仲本県碇谷群荒井町茶123ー21 ● 「han」を使うと半角にできるものは半角に $ cat phone-no | han 001 067?4321?8834 志村県加藤市高木町1-9?3 002 0120-212?212 仲本県碇谷群荒井町茶123?21 ● 住所の番地を全角に戻す $ cat phone-no | han | zen 3 001 067?4321?8834 志村県加藤市高木町1-9ー3 002 0120-212?212 仲本県碇谷群荒井町茶123ー21 Mar. 16, 2012 Open Source Conference 2012 Tokyo/Spring 12
  • 13. 使ってみる2 --- keta ● 列を揃える 見づらい 見やすい Mar. 16, 2012 Open Source Conference 2012 Tokyo/Spring 13
  • 14. 使ってみる3 --- join1 ● データの結合 データ:http://www.pursue.ne.jp/jouhousyo/SQLDoc/select21.html 売上データ 顧客データ $ cat uriage $ cat kokyaku 1 2001/05/27 105 101 二島商店 2 2001/05/27 101 102 姫路商事 3 2001/05/27 103 103 大阪物産 4 2001/06/27 102 104 神戸商店 5 2001/06/27 104 105 福岡商事 データを結合する $ sort -k3,3 uriage | join1 key=3 kokyaku - | sort 1 2001/05/27 105 福岡商事 2 2001/05/27 101 二島商店 3 2001/05/27 103 大阪物産 4 2001/06/27 102 姫路商事 5 2001/06/27 104 神戸商店 Mar. 16, 2012 Open Source Conference 2012 Tokyo/Spring 14
  • 15. 使ってみる4 --- mdate, yobi ● 日付の列挙 $ mdate -e 20120101 20120110 20120101 20120102 20120103 20120104 20120105 20120106 20120107 20120108 20120109 20120110 ● 2月末日は? $ mdate 20120301/-1 20120229 ● 曜日をつける $ mdate -e 20120101 20120104 | tarr | yobi -j 1 20120101 日 20120102 月 20120103 火 20120104 水 Mar. 16, 2012 Open Source Conference 2012 Tokyo/Spring 15
  • 16. 使ってみる5 --- count, sm2 ● 数え上げ $ cat data 山田 山田 上田 $ sort data | count 1 1 山田 山田 4 山田 上田 2 上田 ● 集計 $ cat data 001 23324 001 1235 $ sm2 1 1 2 2 data 002 3243 001 24559 002 -32345 002 -29102 003 425 003 392.65 003 0.15 003 -32.5 Mar. 16, 2012 Open Source Conference 2012 Tokyo/Spring 16
  • 17. 使ってみる6 --- webシステム ● bashCMS ● USP友の会のブースで展示。ソース見せます。 http://www.usptomonokai.jp/ Mar. 16, 2012 Open Source Conference 2012 Tokyo/Spring 17
  • 18. Open usp Tukubaiの入手 ---その1 ● FreeBSD ports ● 収録されました (/usr/ports/devel/open-usp-tukubai) ● 当面、portsnap extract または portsnap update で入手 http://www.freshports.org/devel/open-usp-tukubai/ Mar. 16, 2012 Open Source Conference 2012 Tokyo/Spring 18
  • 19. Open usp Tukubaiの入手 ---その2 ● github ● Tukubaiで検索 https://github.com/usp-engineers-community/Open-usp-Tukubai Mar. 16, 2012 Open Source Conference 2012 Tokyo/Spring 19
  • 20. Open usp Tukubaiの入手 ---その3 ● UECサイト(usp engineers' community) ● https://uec.usp-lab.com Mar. 16, 2012 Open Source Conference 2012 Tokyo/Spring 20
  • 21. まとめ ● コマンドあってのシェルスクリプト ● コマンドを使わないと素敵ではない ● Open usp Tukubaiは便利 ● 端末?シェルスクリプトをどんどん便利にする試み ● FreeBSD, GitHub, uecサイトで入手可能 ● Software Design 連載もお願いします(17日発売) ● 開眼シェルスクリプト – 第4回:表とグラフを描く――HTMLファイルの出力 – Mar. 16, 2012 Open Source Conference 2012 Tokyo/Spring 21 –