コンピュータ入門 第
16回
UNIXのツールたち
シェルスクリプト⼊⾨
シェルスクリプト⼊⾨
本日の話題
とっても便利なUNIXのツール(コマンド)たち
テキスト12章cut, touch, sort ....
正規表現⼊⾨
テキスト12章 12.7.1 いろんな⽂字列パターンを簡単に表現 grep, sed を使ってみようシェルプログラミング⼊⾨
テキスト3章,13章 シェルスクリプトって? 変数,制御制御⽂UNIXのツールたち
便利に使って作業効率UP!
UNIXのコマンド
UNIXはもともと科学技術関係の研究⽤シス
テムとして開発
研究・開発に必要・便利なさまざまなコマンド
がある
⾼機能なコマンドからシンプルなものまで
UNIXコマンドは,
⼩さな機能をもつコマンドを組み合わせて複雑
⼩さな機能をもつコマンドを組み合わせて複雑
な処理をさせる
ことができる!!
リダイレクションやパイプを⽤いたコマンド間のデー タの受け渡し機能を存分に利⽤UNIXのツールの考え方
UNIXはもともと科学技術関係の研究⽤シス
テムとして開発
⼤量のデータに対して、同じ処理を繰り返し⾏
うのに適している。
誰がいつ実⾏しても同じ実験結果が出るように
するのに適している。
つまり処理の⾃動化
が簡単にできるように作られて
いる。
2010年度コンピュータ入門 5 つまり紹介するコマンド
すべては紹介できない
テキストには,よく使う便利なものを選びに選んで 掲載 掲載ここではさらに選りすぐった以下のコマンドを
紹介
cut : ⼊⼒⽂字列から指定された部分を切り出し sort: あるルールに従ってデータを整列 tr : ⽂字を置き換え touch: ファイルにお触り grep: 指定された⽂字列を含むものを表⽰ sed: ⼊⼒⽂字列中の指定されたパターンを置換オンラインマニュアル
(おさらい)
UNIXでは,ほとんどすべてのコマンドに対する
オ
ンラインマニュアル
を完備
コマンドや,ファイル,機能に関する詳細な説明 “man”コマンドで参照
例 “cse$ man man”: manコマンドに関するマニュアル
UNIXを利⽤する上で,オンラインマニュアルの活
⽤は必須.
2010年度コンピュータ入門 7 たいていのことはマニュアルに記載 ⼈に聞く前にマニュアルを読む 最近はほとんど⽇本語のマニュアルになっているオンラインマニュアルの見方
$ man ls
• [space] で Page Down • ‘b’ で Page Up
日本語マニュアルに関する注意
ほとんどのマニュアルはもともと英語で書か
れている。
どこかの親切な⼈がボランティアで⽇本語に訳
してくれている。
⽇本語版を販売しているメーカーが嫌々訳して
いる。
ありがたいんだけどあまりいい⽇本語ではな
2010年度コンピュータ入門 9ありがたいんだけどあまりいい⽇本語ではな
い場合が多い。
興味のある⼈は英語のマニュアルを探して読
んでみよう。
コマンドの紹介
UNIXでよく用いられるデータ形式
エディタで作成できる「テキスト」
これを「プレーンテキスト」データなどという
これを「プレ ンテキスト」デ タなどという
⾏列形式
各⾏の区切りは改⾏記号<CR>
各列(フィールド)は区切り⽂字(スペース、”,”な
ど)で区切られている
⾏ 意味 あ
た
デ タ
1⾏に意味のあるひとかたまりのデータ
データ作成に⽤いたプログラムが無くなって
も、これなら
何とかなる
。
2010年度コンピュータ入門 11データファイルの例
TOTO 1982 TOTO IV Rosanna 5:32 TOTO 1982 TOTO IV Make Believe 3:48 TOTO 1979 Hydra All Us Boys 5:03 TOTO 1979 Hydra All Us Boys 5:03 TOTO 1981 Turn Back Goodbye Elenore 4:54 Journey 1981 Escape Keep On Runnin’ 3:40 Journey 1983 Frontiers Separate Ways 5:27
実際のデータ
TOTO<TAB>1982<TAB>TOTO IV<TAB>Rosanna<TAB>5:32<CR>TOTO<TAB>19 82<TAB>TOTO IV<TAB>Make Believe<TAB>3:48<CR>TOTO<TAB>1979<TAB>
82<TAB>TOTO IV<TAB>Make Believe<TAB>3:48<CR>TOTO<TAB>1979<TAB>
Hydra<TAB>All Us Boys<TAB>5:03<CR>TOTO<TAB>1981<TAB>Turn Bac k<TAB>Goodbye Elenore<TAB>4:54<CR>Journey<TAB>1981<TAB>Esca pe<TAB>Keep On Runnin’<TAB>3:40<CR>Journey<TAB>1983<TAB>Fr ontiers<TAB>Separate Ways<TAB>5:27<CR>
2010年度コンピュータ入門 13 以下紹介するコマンドは、このようなプレーン テキストデータを処理するのに適したもの
cut コマンド
名前通り…
切り出す
プログラム
指定された⽂字を区切り⽂字(delimiter, separator)とし てフィールド(カラム)に分離( ) 指定したフィールドのみを出⼒よく使うオプション
-d 区切り⽂字 : 区切り⽂字を指定 スペースなどシェルに対する特殊⽂字は “ “で囲む 9 例 -d“ “ ←スペースを区切り⽂字にしたい時 -f フィールド番号f フィ ルド番号 : 最初から何番⽬のフィールドを出⼒: 最初から何番⽬のフィ ルドを出⼒ するか? 複数指定するときは,”,(コンマ)”で区切る 9 例 -f1,2,5 -c ⽂字リスト : 任意⽂字⽬を区切りにする -b バイトリスト : 任意のバイト⽬を区切りにするcut の使用例
$ echo “aaa:bbb:ccc:ddd:eee”| cut -d: -f1,3 aaa:ccc
$ ls *.tex
report1.tex report2.tex report3.tex $ ls *.tex | cut -d. -f1 report1 report2 report3 2010年度コンピュータ入門 15 “cut [オプション] ファイル名”のように⼊⼒ファイル名を 指定すると,ファイル内のデータを cut!! “cat ファイル名 | cut [オプション]” と同じ ファイルの中身を表示するコマンド
やってみよう
echo "aaa,bbb,ccc,ddd"
echo "aaa,bbb,ccc,ddd" | cut -d, -f1,3
who
who | cut -d" " -f1
ls -1 *.tex
l 1 * t
|
t d f1
ls -1 *.tex | cut -d. -f1
ls -1 コマンドは1⾏に1ファイル名で出⼒されるsort コマンド
名前通り…
整列する
(並べ替える)コマンド
⼊⼒データの各列を数字 or アルファベット順に並べ替 えて出⼒ えて出⼒よく使うオプション
-n : 番号順に整列 これをつけないと,⼀⽂字ずつ辞書順で整列 9 例 111と23を与えた時, -n なし: 111, 23 -n あり: 23, 111 2010年度コンピュータ入門 17 -t 区切り⽂字 : フィールドの区切り指定 -k フィールド番号: 何番⽬のフィールドを使って整列さ せるか? -r : 逆順整列(普通は昇順)sort の使用例
$ cat sort-data katayama:200: takumi:100: $ sort sort-data katayama:200: katayama:30: katayama:30: takumi:90: katayama:30: takumi:100: takumi:90: $ sort -t : -k 2 sort-data takumi:100: $ sort -n -t : -k 2 sort-data katayama:30: takumi:100: katayama:200: katayama:30: takumi:90: katayama:30: takumi:90: takumi:100: katayama:200:やってみよう
ls -l
ls -l | sort -n -k 5
ファイルサイズでソートされるはずls -l | sort -k 6
⽇付でソートされるはず 2010年度コンピュータ入門 19 ⽇付でソ トされるはず ⽇付は数字じゃないので -n は指定していないtr コマンド
tr … TRanslates characters
1⽂字単位での⽂字の置き換えコマンド
1⽂字単位での⽂字の置き換えコマンド
sed は複数の⽂字(⽂字列)の置き換え
使⽤例
tr ʼ[a-z]ʼ ʼ[A-Z]ʼ
⼊⼒⽂字列の⼩⽂字をすべて⼤⽂字に変換tr ʼ[A-Z]ʼ ʼ[a-z]ʼ
⼊⼒⽂字列の⼤⽂字すべて⼩⽂字に変換tr -d ʼ¥nʼ
⼊⼒データから改⾏(¥n)をすべて削除touch コマンド(テキストなし)
指定されたファイルが存在する場合,ファイ
ルの更新⽇時を更新
指定されたファイルが存在しない場合,新し
くファイルを作成(中⾝は空っぽ)
よく使うオプション
2010年度コンピュータ入門 21 -a : アクセス時刻のみ変更 -m : 変更時刻のみ変更 -c : ファイルがない場合作らない -t 時刻 : 指定時刻に変更(普通は現在時刻)touch の使用例
$ ls -lrw 1 e000010 system 49 05月27日 19:03 sort data -rw--- 1 e000010 system 49 05月27日 19:03 sort-data $ touch chotto
$ ls -l
-rw--- 1 e000010 system 0 05月27日 19:12 chotto
-rw--- 1 e000010 system 49 05月27日 19:03 sort-data $ touch sort data
$ touch sort-data
-rw--- 1 e000010 system 0 05月27日 19:12 chotto -rw--- 1 e000010 system 49 05月27日 19:13sort-data
正規表現入門
正規表現とは?
詳しくは計算機⾔語等の講義で ここでは以下のように考える ⽂字やその繰り返しを表す特殊な表現(特殊⽂字)を ⽂字 繰り返 表 特殊な表現(特殊⽂字) ⽤いて,任意の⽂字列パターンを現すもの 例 「⼩⽂字のアルファベット5⽂字からなる⽂字列」 という意味の正規表現 9 [a-z][a-z][a-z][a-z][a-z] 「⼩⽂字のアルファベットの後ろに数字がくっついている⽂字列」 と う意味の正規表現 という意味の正規表現 9 [a-z]*[0-9]* 正規表現にもいろいろな種類がある ここでは,sed, grep で⽤いられるものを扱う オンラインマニュアル regexp を参照!!正規表現での特殊文字
特殊⽂字
⽂字列のパターンを現すために⽤いる記号(⽂字) 特殊⽂字 組み合わせ 好きな⽂字列 パタ ンを表 特殊⽂字の組み合わせで,好きな⽂字列のパターンを表 現 特殊⽂字の種類と意味 . : 任意の1⽂字 [abc]: a,b,c のいずれか1⽂字 [^abc]: a,b,c 以外の1⽂字 中 「 ^: ⾏の先頭 $: ⾏の末尾 ¥{m¥} :直前で指定した ⽂字のm回の繰り返し 2010年度コンピュータ入門 25 ^ は [ ] の中で⽤いると,「〜 でない」という意味 [0-9] : 0から9のいずれか1⽂字 * : 直前の⽂字の0回以上の繰り 返し ⽂字のm回の繰り返し ¥: 特殊⽂字を特殊⽂字と して扱いたくない場合にエ スケープ テキストに,他にもいろいろ載って いるので,各⾃確認すること. より詳細には,オンラインマニュア ル参照の事正規表現の例
みなさんの基盤ID
例 cin15000, cht15000…
先頭の⼀⽂字が”c” 続いて⼩⽂字のアルファベット 先頭の ⽂字が c ,続いて⼩⽂字のアルファベット が2⽂字、数字が5⽂字正規表現で現すと…
^c[a-z][a-z][0-9][0-9][0-9][0-9][0-9] or ^c[a-z]¥{2¥}[0-9]¥{5¥}基盤 は
基盤IDは
⽇本語では「先頭が"c"でそのあとに⼩⽂字のアル ファベットが2⽂字、数字が5⽂字続く⽂字列」 正規表現では「 ^c[a-z]¥{2¥}[0-9]¥{5¥} 」正規表現の例
パスワードのエントリ
例
cin15000:xxxxxx:100:200:TEST:/home/22115/cin1 “ypcat passwd” というコマンドで確認できます cin15000:xxxxxx:100:200:TEST:/home/22115/cin1 5000:/bin/bash : で区切られた7つのフィールド 9 ユーザ名:パスワード:UID:GID:GCOS:ホーム:ログインシェル ⽇本語で表すと 「":"で区切られた7つの⽂字列からなり、そのうち3,4番⽬の 部分は数字。また各⽂字列は空でもいい。」 正規表現で現すと 2010年度コンピュータ入門 27 正規表現で現すと ^[^:]*:[^:]*:[0-9]*:[0-9]*:[^:]*:[^:]*:[^:]* ユーザ名やファイル名に使える⽂字は限定されているので、厳密 には正確ではないが…正規表現を使うコマンド
正規表現を利⽤して,さまざまな⽂字列マッチング
を⾏う事で便利に使えるコマンドがある
grep : Global Regular Expression Print
与えられた正規表現にマッチする⽂字列を含む⾏を出⼒ つまり検索を⾏うコマンド
よく使うオプション
9 -v: 指定された正規表現にマッチする⽂字列を含まない⾏を出⼒
d S i
sed : Stream EDitor
sed コマンドにデータを流し込むと,正規表現で書かれた⽂字列 パターンにマッチ(合致)する⽂字列を次々に処理
grep の例
パスワードファイルから,cin15で始まるユー
ザ名のエントリのみ出⼒
t d | ʼ^ i 15[0 9]* ʼ
ypcat passwd | grep ʼ^cin15[0-9]*:ʼ
もうちょっと正確には
ypcat passwd | grep ʼ^cin15[0-9]¥{3¥}ʼ
(cin15で始まりその後に数字が3つ続くエントリ)
もうちょっとずるをすると
ypcat passwd | grep cin15
(パスワードファイルにcin15を含むエントリ)
2010年度コンピュータ入門 29
(パスワ ドファイルにcin15を含むエントリ)
「ログインシェルが/bin/bashの⼈」以外を出
⼒
ypcat passwd | grep -v ʼ/bin/bash$ʼ
なぜ
' が出てくるの?
おさらい
economy tex macro tex micro c micro tex
economy.tex, macro.tex, micro.c, micro.tex
があったとする
ls *.tex
ls economy tex macro tex micro tex
shellが置き換えてくれる
ls economy.tex macro.tex micro.tex
OS
が上記コマンドを実⾏
なぜ
' が出てくるの?
shellにも*などのメタキャラクタがある。
grep ^cin[0-9]*: とするとgrepに渡される以前に
g p
[
]
g p
shellが*を変換しようとしてしまう。
(変換されない場合もある。)
ルール
shell は ' ' で囲まれた部分は変換しない shell は で囲まれた部分は変換しない。 該当するファイル名がない場合はメタキャラクタを変換 せずにそのままコマンドに渡す。 2009年度コンピュータ入門 31やってみよう
ypcat passwd
ypcat passwd | grep 22115
ypcat passwd | grep ⾃分のlogin名
ypcat passwd | grep bw
sed の例
ファイル中の bigin を begin に変換
sed ’s/bigin/begin/g’
g
g
g
ファイル名
s: 変換しなさい /変換前⽂字パターン/変換後⽂字パターン/ g: 同じ⾏に複数ある場合はすべて 9 g をつけないと,⼀度変換してしまうとその⾏は終了⾏頭のスペースを削除
2010年度コンピュータ入門 33sed ’s/^[(
スペース) ]*//’
先頭(^)のスペースの繰り返し(*)を空⽂字列に変換. つまり削除sed のちょっと複雑な変換例
パスワードエントリからユーザ名とログイン
シェルを抜き出す
出⼒は 「 ザ名 グインシ ル 」 形式としよう 出⼒は 「ユーザ名:ログインシェル 」の形式としようパスワードのエントリは以下の通り
ユーザ名:パスワード:UID:GID:GCOS:ホーム:ログイン シェル つまり:で区切られた7つのフィールドの1つめと7つ めを出⼒するパスワードエントリの正規表現
[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*[^:]*
(:以外の⽂字列)を
☆で表すとすると
☆:☆:☆:☆:☆: ☆:☆sed のちょっと複雑な変換例
sed では ¥(¥)でくくるとその部分が保存され,
後から ¥数字 で参照できる
後
数字 参照
☆で表現すると
ypcat passwd | sed 's/¥(☆¥):☆:☆:☆:☆:☆: ¥(☆¥)/¥1:¥2/'
正規表現に戻すと
2009年度コンピュータ入門 35正規表現に戻すと
ypcat passwd | sed ʼs/¥([^:]*¥):[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:¥([^:]*¥)/¥1:¥2/ʼ実際は改行なし「答えは一つじゃない」
UNIXでは同じことをするのにいろいろな⽅法が考えられま す それでいい! ⾃分の好みの⽅法を使いましょう それでいい! ⾃分の好みの⽅法を使いましょう。 100⼈いれば100種類の答えがあってあたりまえ。 「パスワードエントリからユーザ名とログインシェルを抜 き出す」 さっきはsedで実現した cut コマンドでもできる cut コマンドでもできる awk という別のコマンドを使う⽅法もある(⿊柳の好きな⽅法) 最近のはやりは perl という⾔語を使う⽅法 Emacs の⽅形カット機能(M-x kill-rectangle)を使ってもできる Emacs で⼿動で(⼒業で)削除するのもありといえばありシェルプログラミング入門
シェルプログラミングってなに?
シェルプログラミング
シェルスクリプト(shell script)を作成し,実⾏する事 script = 芝居などの台本のこと
shell script = shell の台本
= 複数コマンドの⾃動実⾏のための台本
上 ⼒す ドを
gnome-terminal上で⼊⼒するコマンドをそのままファ イルに記述して⼀気に実⾏する台本を書くことができ る!
はじめに注意事項を
皆さんが使っている shell は bash です。
echo $SHELL とやってみよう
echo $SHELL とやってみよう
bash を⽤いた shell script もあります。
が、ここでは基本となる sh を使う shell
2010年度コンピュータ入門 39script について勉強することにします。
bash は sh の上位互換 (sh で実⾏可能なものは
bashでも実⾏可能)
シェルスクリプトの作成法
$ pwd foo よく行う作業 ファイルにそのまま書く $ date $ ls pwd <CR> date <CR> ls <CR> foo そのファイル名で中に書いてある 連の作業を実行できる $ foo 一連の作業を実行できる 簡単!シェルスクリプト
既存のコマンドと全く同様に使える
(リダイレクション、パイプなど)
⾃分専⽤のコマンドを簡単に作成することが
できる。
if for などの条件⽂やループ処理も使えるの
2010年度コンピュータ入門 41if, for などの条件⽂やル プ処理も使えるの
で、⼀種のプログラムを作ることができる
シェルスクリプトの作成法
(ちょっと大げさでした)
foo #!/bin/sh<CR> pwd <CR> date <CR> ls <CR>% chmod u+x foo
先頭で「shを使っ て実行してくださ い」という宣言を
する
% chmod u+x foo
一つのファイルにつ き一回でOK。
やってみよう
emacs foo &
foo というファイル名で以下の内容を保存
#! /bin/sh pwd date ls 2010年度コンピュータ入門 43chmod u+x foo
./foo
./foo | sort | less
シェルプログラミングの基本事項
(1)
基本事項
コメント
# 始まる⾏は プ グラムとし 実⾏されな # で始まる⾏は,プログラムとして実⾏されない変数(後述)
変数とは,値を⼊れておく⼊れ物 変数名=値 で変数に値を代⼊ 変数の中⾝を参照する時は,$変数名 #/bi / h #/bin/sh # ここはコメン ト i=Hello echo i echo $i echo $iWorld % ./hello i Hello HelloWorld 実行シェルプログラミングの基本事項
(2)
コマンド置換 ` (バッククオート) で囲むと,その部分がコマンドの実⾏結果 に置き換わる(ʼ (シングルクオート)ではないので注意) に置き換わる( (シングルクオ ト)ではないので注意) #!/bin/shecho “Now, it is `date`”
% ./nowdate Now, it is 2010年05月28日 16時36分43秒 2010年度コンピュータ入門 45 他にもいくつか注意点があるので, テキストに目を通しておく事!!
以下、プログラミングに関する話があります
詳しいことについては、後半の授業、「プログラミ
ングI」にてプログラミングについて勉強した後に、
書
内容が
ず
書いてある内容がわかるようになるはずです。
でも、ちょっとやってみればきっと理解できます。
来週からの課題で若⼲使⽤しています。
来週からの課題で若⼲使⽤しています。
プログラミングの講義の前に,がんばって理解して
みましょう。
制御構造
計算機に仕事をさせる時の基本的な構造
逐次処理
逐次処理
命令を書かれた順に処理 今までの例はすべて逐次処理選択処理
条件にしたがって処理する内容を変更反復処理
2010年度コンピュータ入門 47反復処理
同じ処理を繰り返し選択処理
if ⽂
条件によって処理する内容を変える
if 条件 then 条件が真の時の処理(複数⾏可) fi if 条件 then then 条件が真の時の処理(複数⾏可) else 条件が偽の時の処理(複数⾏可) fi選択処理
条件によって処理する内容を変える
いくつでも書ける if 条件 then 処理1 elif 条件2 then 処理2 2009年度コンピュータ入門 49 なくてもよい else 処理3 fi選択処理
#!/bin/sh ffname=xxxx.txt if [ -f $fname ] thenecho $fname exists. else
echo $fname is not found. fi $fname が存在していたら fi [ -f filename ] は,filename という ファイルが存在した時に成り立つ 詳しくは 13.3.1, 13.3.4参照
変数
⽂字列を保存することが出来る箱
任意の名前をつけることが出来る
任意の名前をつけることが出来る
filename=hoge.txt
echo $filename
filename という名前の変数echo $filename
echo $filename exists.
2009年度コンピュータ入門 51 filename という変数の中身
選択処理の例
#!/bin/sh #!/bin/sh fname=hoge.txt if [ -f $fname] thenecho $fnameexists. else
echo $fnameis not found.
2009年度コンピュータ入門 fi
なにがうれしいの?
変数 fname の定義を⼀⾏変えるだけで、い
ろいろな名前のファイルが存在するかどうか
を確認できる。
変数 fname の中⾝を変えて、繰り返しこの
シェルスクリプトを実⾏すれば、⾃動的にた
くさんの名前のファイルが存在するかどうか
を確認できる
を確認できる。
2009年度コンピュータ入門 53反復処理
同じ内容を繰り返す
for ⽂
#!/bin/shforsyurui intxt tex dvi ps do
for ⽂
for 変数 in 単語リスト do 処理1 処理2 … done do echo $syurui done %./for-test txt tex done dvi ps 変数に単語リスト中の単語をひとつずつ代入し, do と done の間の処理を繰り返し行おさらい(ファイル名の展開)
aaa, bbb, ccc という3つのファイルが存在する
ディレクトリの場合、
% ls -l * % ls -l aaa bbb ccc Shell が * を存在するファイルの リストに展開してくれる Shell の内部処理 2010年度コンピュータ入門 55 「ファイルリストが出力され る」よく用いる反復処理の例
For
filename
in
*
do
ls l $filename
ls -l $filename
wc $filename
done
$filename が存在するファイルの名前に順番に置き換え られて、ファイルの存在する回数だけ繰り返し実⾏され る る。 このスクリプトを実⾏したディレクトリに存在するファ イルすべて(ʼ*ʼの部分)について、ʼls -lʼとʼwcʼを順番に 実⾏するその他
選択処理
他にも,case ⽂(13.3.5) がある反復処理
反復処理
他にも,while ⽂(13.3.3) があるスクリプト作成時の注意事項
単語は全て空⽩で区切ること。 2010年度コンピュータ入門 57 全⾓の⽂字と半⾓の記号を区別すること。 コメント以外に全⾓の⽂字は使わない! 最後に改⾏を忘れないこと。 #!/bin/sh WD reportその他
if と for を使った例
xxxx.tex というファイル名に 対して この部分で WD=report cd cd $WDfor filename in *.tex do
if [ -f `echo $filename | cut -d. -f1`.dvi ] then
echo $filename has already compiled.
対して,この部分で xxxxという名前を⽣成している $filename を受け取って, 区切り⽂字 . ⼀番⽬のフィールド出⼒ その後ろに,”.dvi” をくっつける echo $filename has already compiled.
else platex $filename fi done xxxx.tex というファイル名に 対して,この部分で xxxx.dvi という名前を ⽣成している