計算数学 第11回 「シェル - ワイルドカード,正規表現,エイリアス」
97/06/20 藤井 中 (東京大学大学院数理科学研究科)
●本日の授業のキーワード
シェル, ワイルドカード, 正規表現, エイリアス, ftp.
●本日の目標
エイリアスを知り、楽をする。
ワイルドカードを使って複数のファイルをまとめて扱う方法を覚える。
grepの正規表現を用いて、特定の文字列を検索する。
コマンド ftp を覚える。
0. 目次
1. シェル(shell)
1-1. シェル(shell)とは?
1-2. シェルの役割
1-3. 主なシェル
1-4. 自分のシェル
2. エイリアス
3. ワイルドカード *
3-1. ワイルドカード とは?
3-2. その他のワイルドカード文字を使う
3-3. ワイルドカードと echo
4. 正規表現
4-1. grep を使った検索の準備 (テキストファイルを ftp して取って来る)
4-2. grep の正規表現を使った検索
4-3. 演習問題
1. シェル(shell)
1-1. シェル(shell)とは?
シェル(shell)とは Unix のコマンドインタプリタ(コマンドを解釈実行
するプログラム)のことです。
ログイン時にとりあえず一つ実行されます (login shell)。
1-2. シェルの役割
シェルには大きく分けて3つの役割があります。
1) ユーザーインターフェース
・プロンプトの表示
・コマンドの読み込み
・コマンドの前処理(解釈)
・コマンドの実行
2) 環境設定の道具
3) プログラミング言語
1-3. 主なシェル
主要なシェルには以下のようなものがあります。
1) sh (Bourne shell)
開発者の名前を名付けられています。
Unix のたいていのバージョンに含まれています。
2) csh (c shell)
対話形式の入力に対し効率良く動作するように設計されています。
シェルに対する命令形式が C 言語に似ていることから c shell
と呼ばれています。
ファイル名の補完、 エイリアス,、ヒストリー、
ジョブ制御などはこの c shell の機能です。
3) その他
tcsh (TC shell) ; c shell の発展版
bash
zsh
ksh
などがあります。
1-4. 自分のシェル
自分の login シェルは4月の授業でアカウントを切った際に
/bin/bash と /bin/tcsh の2通りを説明しました。
% echo $shell
と入力することによって、調べる事ができます。
2. エイリアス
エイリアスとはコマンドに別名をつける機能です。
但しこれは c shell の機能で, Bourne shell にはありません。
長い名前のコマンドや、コマンドの名前を変更する時に有効です。
% alias (新しいコマンド名) (古いコマンド名)
で定義され、使い方はいろいろあります。
1) コマンドタイプの手間を減らす
% alias md mkdir
とすると, md で mkdir(ディレクトリ作成)を実行できる.
2) 新しいコマンドを作る
% alias ms 'rlogin mstm04.ms.u-tokyo.ac.jp '
% ms
Password:
(mstm04のパスワードを聞かれる。このとき、login 名は msedu と同じもの。)
3) コマンドの意味を変更する
% alias rm 'rm -i'
% rm test
% rm: remove test?
(i と言うオプションにより、ファイル test を本当に
消していいかを尋ねられる。これをつけなかったが為に
筆者自身も二度ほとんどのファイルを消すと言う失態あり T_T。
某先生が .(dot)ファイルを全て消去したと言うことも
ありました。)
などである. 但し, logout するとこれらの設定は無効になります。
# % alias a alias とすると,どうなるでしょうか?
これに対して、unalias と言うエイリアス解除コマンドがあります。
alias を設定し, 動作を確認した後、
% unalias (エイリアスされたコマンド名)
として、どうなるか確認して下さい。
alias を恒久的に使いようにするには、次のようにします。ただし、これは
login シェルが /bin/tcsh の時の話で、/bin/bash の場合は、以下の入力
だけでは不十分な場合があります。
.tcshrc (/bin/bashの方は .bashrc) に上で入力したことを書いて下さい。
例.
alias rm 'rm -i'
以下、各自で設定してみて下さい。
3. ワイルドカード * (アスタリスクと読む)
3-1. ワイルドカードとは?
まず、ディレクトリ/binの中にどんなファイルがあるか調べてみます。
次のように入力します。
% ls /bin
たくさんのファイル名が表示されます。
今度は、次のように入力してみます。
% ls /bin/w*
また、次のようにも入力してみましょう。
% ls /bin/ch*
ls /bin/w* では、wで始まるファイル名が(ディレクトリ名 /bin/ とともに)
全て表示されます。同じように ls /bin/ch* では、chで始まるファイル名
が全て表示されます。
このように文字 * には、(空列を含む)任意の文字列に展開するという
特別な意味があり、このような特別の意味をもつ文字を『メタキャラクタ』
と呼びます。
ですから、文字列 ディレクトリ /bin の直下で文字列 gr を含むファイルを
表示させるには、次のように入力すれば、見られます。
% ls /bin/*gr*
【注意】
ls のオプション設定 -F があるとファイル名の最後に * が
表示されることがあります。
これは、そのファイルが実行できるということを示す記号で、
ファイル名の一部ではありません。
% ls -F /
と入力して、結果を確かめてみて下さい。
問題
次の3つの入力に対する出力結果を予想しましょう。
違いはあるでしょうか?
% ls ~/
% ls ~/.
% ls ~/*
実際に試してみて下さい。予想は正しかったでしょうか?
3-2. その他のワイルドカード文字を使う
ファイルを指定するには、上記のワイルドカード文字 * の他、以下の
ワイルドカード文字が使えます。
? 任意の1文字とマッチ。
[list] list中の1文字とマッチ。
[lower-upper] lower と upper の範囲にある文字とマッチ。
例えば、カレントディレクトリに
docA, docB, docC, doc1, doc2, doc3, docAA
がある場合、以下のようになります。
% ls doc??
docAA
% ls doc[A1]
doc1 docA
% ls doc[A-C]
docA docB docC
各自ファイルを作って確かめてみましょう。ファイルの作り方は cat
を用いる方法や touch を利用する方法(下記参照)があります。
▲ touch コマンド
touch というコマンドを使うと空のファイルを作成することが出来ます。
% touch newfile
3-3. ワイルドカードと echo
ワイルドカード文字は、ls 以外のコマンドとも組み合わせて使えます。
ここでは、echo というコマンドと組み合わせてみて、
ワイルドカード文字のファイル名の展開という機能を詳しくみてみます。
echo コマンドは、引数として入力された文字列を画面(標準出力)に
書き出します。
% echo keisan suugaku
keisan suugaku
% echo 'keisan suugaku'
keisan suugaku
では、次のコマンドを実行してみて、'(アポストロフィ)で囲んだときとの
違いや、引数に、ワイルドカード文字が含まれる場合、
どのようになるのかを調べてみて下さい。
% echo /bin/w*
% echo '/bin/w*'
% echo /bin/ch*
% echo '/bin/ch*'
% echo /bin/*gr*
% echo '/bin/*gr*'
% echo ~/
% echo '~/'
% echo 'doc??'
% echo doc??
% echo doc?????
% echo doc[A1]
% echo doc[A-C]
ワイルドカードを含まないときの echo の機能を
もう一度確認しておきましょう。
% echo /bin
% echo '/bin'
% ls /bin
下の2つのコマンドの結果を予想してから、実験して見て下さい。
(echo の実行結果を見てから、ls の結果の予想を立て直して下さい。)
% echo ~/.*
% ls ~/.*
予想は正しかったでしょうか?
4. 正規表現
4-1. grep を使った検索の準備(テキストファイル作成)
ファイル名の展開で使用したワイルドカードと似たような機能に
正規表現というものがあります。正規表現とは、
『いくつかの記号を用いてある文字列のパターンを表現する』
というものです。
こちらは、ファイルの中の文字列のマッチングに使います。
正規表現は、ファイル中の文字列のマッチングなので、
文字の書いてあるファイル(テキストファイル)を準備します。
まず、LaTeX というディレクトリを作成し、その下に、
text.tex, sec1.tex, sec2.tex
という名前のテキストファイルをコピーします。
ファイルは、mstmのataruのホームディレクトリにあるので、
いずれかのサーバーから ftp して、もらって来て下さい。なお、
みなさんで一斉に ftp すると回線が混雑し、世界中の御迷惑と
なる場合がありますので、1台のマシンでどなたかが ftp した
後は、他の方はそこから cp するようにして下さい。
(i)ftpの仕方
ローカルホストとリモートホストとの間でファイルを転送するための
コマンドに ftp というものがあります。
どういうコマンドが使えるかは ? を入力すると表示されますが、
最低限知っていて欲しいコマンドは次の通りです。
ls ディレクトリ中のファイルが表示される.
cd ディレクトリ移動ができる.
get ファイルをとってくる.
put ファイルを相手ホストに送る.
bye ftp から抜ける
実際の作業の手順ですが、
% mkdir LaTeX (ディレクトリ LaTeX を作ります。)
% ftp mstm01.ms.u-tokyo.ac.jp
うまくいくと、次のようにName を尋ねられる。
Name (mstm01.ms.u-tokyo.ac.jp:ataru):
#msedu も ms と言う同じサブドメインなので、% ftp mstm01 で実は十分。
#また、mstm はmstm01〜mstm04まであり、どれからでも ftp できるので、
#適度に分散してもらって来て下さい。
ataruとなっているところには、msedu でのlogin 名になるので、
それと ms での login 名が同じ人は何も記入せず Enter(Return)。
異なる人は ms の login 名を入力して Enter。すると、パスワード
を尋ねられるので、ms のパスワードを入力する。うまくいくと、
230 User ataru logged in
>ftp
等と表示される。
>ftp cd ~ataru/LaTeX (tex ファイルの置いてあるディレクトリに移動)
>get sec1.tex (sec1.tex を取って来る。)
>get sec2.tex (sec2.tex を取って来る。)
>get text.tex (text.tex を取って来る。)
また、先程習った * を用いて、
>mget *.tex
でも、もらうことができます。
終了しましたら、
ftp> bye
として、抜けて下さい。
(ii)cpの仕方
% mkdir LaTeX (ディレクトリ LaTeX を作ります。)
% cp /hogehoge/LaTeX/*.tex
(hogehogeさんのところにあるtexファイルをディレクトリ LaTeX にコピーします。)
ファイルの中身は、以下のようになっています。
(cat LaTeX/*.tex で確認できます。実際にはどの行も左には空白はありません。)
%%%%% text.tex %%%%%
\documentstyle{article}
\begin{document}
\title{Keisan Suugaku I}
\author{Your name\\
University of Tokyo
}
\date{}
\maketitle
\input{sec1.tex}
\input{sec2.tex}
\end{document}
%%%%% sec1.tex %%%%%
\section{Group}
Let $G$ be a group.
The {\bf product} of $a$ and $b$,
is denoted by $$ab.$$ On the other hand,
the {\bf inverse} of $a$ is denoted by $$a^{-1}.$$
%%%%% sec2.tex %%%%%
\section{Ring}
\begin{itemize}
\item
the outline of a circle.
\item
a small circular band of precious metal worn on the finger.
\end{itemize}
4-2. grep の正規表現を使った検索
grep は、対象ファイルのなかから検索文字列を探し、
その文字列を含む行全体を画面(標準出力)に表示します。
まず、ディレクトリ LaTeX に移動して下さい。
% cd LaTeX
次のコマンドを入力してみて下さい。
% grep is *.tex
準備で作成した3つのファイルの中から、is を含む行が表示されます。
ところが、Keisan など is の前後に文字が継っているものも表示されます。
このような場合には、is の前後に空白を入れたものを
'(アポストロフィー)で囲みます。
但しこの場合には、行頭や行末にある is は出力されません。
% grep ' is ' *.tex
2語以上連なる場合にも 'で囲みます。
次の2つを比べてみて下さい。
% grep of sec2.tex
% grep 'of precious' sec2.tex
では、行頭にある is を表示させたいときには、どのようにすれば
よいでしょうか?
このような検索をするのに、『正規表現』を使います。
正規表現とは、「いくつかの記号を用いてある(文字列の)パターンを
表現する」というものです。
次のコマンドを入力してみて下さい。
% grep ^is sec1.tex
% grep '^is' sec1.tex
どちらも行頭にある is を含む行だけが表示されましたね。
^ (キャレット、ハット) は行頭を表す文字(メタキャラクタ)です。
下の【注意】にもあるように、^is は 'で囲む方が良い使い方です。
では、sec1.tex のファイルの最後の行にある $$a^{-1}.$$ のように
文字 ^を含む行だけを表示させるには、どうしたら良いでしょうか?
次の2つはどちらもうまくいかないようです。
% grep ^ sec1.tex
% grep '^' sec1.tex
これは、^ が行頭を表すため行頭を含む行(すなわち全ての行)
が出力されるためです。
メタキャラクタの特別な意味を消す為には、メタキャラクタの前に
\ (バックスラッシュ)を添えます。これを『エスケープする』と
いったりします。(特別な意味から避難する?)
% grep '\^' sec1.tex
今度は、うまく表示されるはずです。
【注意】
正規表現は 上のように 'で囲むようにして下さい。
次のコマンドを実行してみて、その結果を比較してみて下さい。
% grep * sec1.tex
% grep '*' sec1.tex
また、正規表現以外で使われるメタキャラクタ( {,}など)
特殊な文字を含む場合も、'で囲むようにしましょう。
grep の正規表現で使われるメタキャラクタには次のようなものがあります。
\m メタキャラクタ m の特別な意味を消す。
^ 行頭を表す
$ 行末を表す
. 任意の1文字を表す
[abcdefg] 文字集合 {a,b,c,d,e,f,g} の中の任意の1文字を表す
[a-z] a から z までの任意の1文字を表す。
[^abcdefg] {a,b,c,d,e,f,g} のどれでもない任意の1文字を表す
r* 文字 r の0回以上の繰り返しを表す
^^^^^^^
次のコマンドを実行したら何が表示されるでしょう。
まず予想して、それから確かめて見ましょう。
また、他の組合せも考えて実験してみましょう。
% grep '\\' *.tex
% grep '\$a\$' *.tex
% grep '^\\section' *.tex
% grep '\$$' sec1.tex
% grep '\$\$' sec1.tex
% grep '\$\$$' sec1.tex
% grep '[Gg]roup' sec1.tex
% grep 'sec[^2]' text.tex
% grep 'itemi*' sec2.tex
% grep 'itemiz*' sec2.tex
% grep ' ........ ' sec2.tex (前後に空白がある)
% grep '........' sec2.tex
4-3. 演習問題
問題1
ルートディレクトリの直下にあるディレクトリを表示させて下さい。
次に look . の出力結果をみてみます。
% look .
look . は、スペルチェッカの辞書にある単語をすべて表示します。
問題2
ea ではじまり e で終わる4文字以上の単語を表示させて下さい。
ea ではじまり e で終わる5文字以上の単語を表示させて下さい。
問題3
ホームディレクトリ(ログインしたときのディレクトリ)に戻り、
次のコマンドを実行したときの結果を予想して下さい。
% ls doc[1-A]
% ls doc[A-1]
問題4
カレントディレクトリ(現在いるディレクトリ)に file1 file2 file3
という名前のファイルがあったとします。
それ以外のファイルが存在しないとき、
% cp *
というコマンドはどのように解釈されるでしょうか?
同じように file1 file2 の2つのファイルがあるときは、
上のコマンドはどのように解釈されますか?
file1 1つだけの場合はどのようになるでしょう。
また、ファイルが一つもないときはどうなるでしょう?
問題5
ホームディレクトリ(cd と打つ。ログインしたときのディレクトリ)
で次のコマンドを実行したときの結果を予想して下さい。
実際にコマンドを打って結果をたしかめて下さい。
% rm doc?
% rm doc??
【注意】---------------------------------------------------
| ファイルを消去する際にワイルドカード文字 * を使うのは、|
| 大変危険です。上の例で rm doc* とするところを |
| rm doc * と打ったら大変なことが起こります。 |
| (防止策は 2.エイリアス参照)
----------------------------------------------------------
参考文献
『正規表現』,『シェル(その1)』『ネットワーク環境の使い方』 (96年度計算数学講義資料).