• 検索結果がありません。

UNIXにおけるスクリプト系言語の活用方法について-香川大学学術情報リポジトリ

N/A
N/A
Protected

Academic year: 2021

シェア "UNIXにおけるスクリプト系言語の活用方法について-香川大学学術情報リポジトリ"

Copied!
32
0
0

読み込み中.... (全文を見る)

全文

(1)

香 川 大 学 経 済 論 叢 第68巻 第 2・3号 1995年11月 561-592

UNIX

におけるスクリプト系言語の

活用方法について

今 井 慈 郎

1 . は じ め に 多くのユーザを抱える

UNIX

は,

C

言語を利用する純粋なプログラマの世 界であると思われがちである。しかし,プログラマ以外の普通のユーザにとっ ても便利なソフトウェアツールが満載された『道具箱

(

t

o

o

lb

o

x

)

Dであると 言うことができる。もちろん,

wUNIX

と言えば

C

言語が常識』という先入観 があり,

C

言語でプログラミングできないユーザは

UNIX

を活用できないの ではないか,という危倶が存在する可能性を否定することはできない。 一方,常に

C

言語でプログラミングしなければ

UNIX

の機能を十分活用で きないという訳ではなく,プログラマ至上主義的な考え方を強要されたとして も多くの

UNIX

ユーザにとってなんら有効ではない。作業効率を考えると

C

言語でのプログラミングという方法論を採用することの方が返って能率低下を 招来する可能性も高い[1 。] 本稿で紹介する

UNIX

スクリプト系言語も

UNIX

の特徴を雄弁に物語って おり,

UNIX

の利便性を多くのユーザに認識させる優秀なプロモータと言え る。スクリプト系言語を,プログラミング言語の範鴎に入れるべきか,あるい はフィノレタなどを構成するソフトウェアツールの仲間に入れるべきか,これま でも議論が分かれることがしばしばあづた。本稿では,スクリプト系言語と総 称する形で, grep, sed, awkあるいはperlなどをまとめて紹介している。 また,コマンドインタープリタであるshell(shとcsh)もスクリプト系言語に 含めて

5

命じたいと考えている。 香 川 大 学 経 済 論 叢 第68巻 第 2・3号 1995年11月 561-592

UNIX

におけるスクリプト系言語の

活用方法について

今 井 慈 郎

1 . は じ め に 多くのユーザを抱える

UNIX

は,

C

言語を利用する純粋なプログラマの世 界であると思われがちである。しかし,プログラマ以外の普通のユーザにとっ ても便利なソフトウェアツールが満載された『道具箱

(

t

o

o

lb

o

x

)

Dであると 言うことができる。もちろん,

wUNIX

と言えば

C

言語が常識』という先入観 があり,

C

言語でプログラミングできないユーザ、は

UNIX

を活用できないの ではないか,という危倶が存在する可能性を否定することはできない。 一方,常に

C

言語でプログラミングしなければ

UNIX

の機能を十分活用で きないという訳ではなく,プログラマ至上主義的な考え方を強要されたとして も多くの

UNIX

ユーザにとってなんら有効ではない。作業効率を考えると

C

言語でのプログラミングという方法論を採用することの方が返って能率低下を 招来する可能性も高い[1 。] 本稿で紹介する

UNIX

スクリプト系言語も

UNIX

の特徴を雄弁に物語って おり,

UNIX

の利便性を多くのユーザに認識させる優秀なプロモータと言え る。スクリプト系言語を,プログラミング言語の範鴎に入れるべきか,あるい はフィノレタなどを構成するソフトウェアツーノレの仲間に入れるべきか, これま でも議論が分かれることがしばしばあった。本稿では,スクリプト系言語と総 称する形で, grep, sed, awkあるいはperlなどをまとめて紹介している。 また,コマンドインタープリタであるshell(shとcsh)もスクリプト系言語に 含めて論じたいと考えている。

(2)

-562 香川大学経済論叢 758 スクリプト系言語を一通り使いこなせば(筆者が使いこなしていると明言す るにはまさに蛮勇が必要であるが), UNIXユーザとしてある意味ではC言語 プログラマと互角であると言える。スクリプト系言語を自在にあやつることが できれば,恐らく UNIXパーワーユーザと呼んでも言い過ぎではないと思わ れる。少し極端な表現ながら,

C

言語プログラムを一切作成せず,スクリプト 系言語だけを利用していてもUNIXの魅力を十分理解できると言える。 UNIX の素晴らしい世界をより詳細に理解しようとすれば参考文献[2 ]が適してい ると思われる。訳本が多いUNIX関係の書籍の中で,日本人の手になる労作 としても評価が高い。 スクリプト系言語の魅力とは何か。誤解を恐れずに一言で言えば

J

簡潔な手 続きで,

C

言語プログラム以上の効果が期待できる』言語と表現することがで きる。簡潔な手続きは決して“単純(低級)"な手続きを意味しない。むしろ, 誰にとっても理解し易いという大きな利点を持っている。スクリプト系言語は C言語よりも多くのUNIXユーザにとってUNIXシステムを身近な存在に感 じさせる重要な役割を果たすことが可能である。これは筆者の持論であるが, UNIXのシステム管理などを行う場合, C言語より役に立つのはスクリプト 系言語であると言える[1 ]。それほどスクリプト系言語はUNIX自体にとっ ても必要不可欠な存在と言える。 スクリプト系言語をいろいろと利用していく上で導入部にはどの言語がいい か,もちろん一概には言えないが,筆者はまず

s

h

および

c

s

h

など,シェルと 呼ばれるコマンドインタープリタを勧めたい。理由は簡単,その利用範囲の広 さと簡潔さである。ほとんどのUNIXユーザが最初にお世話になるのがシェ ルであり,環境設定などのシェルスクリプトはもっともポピュラーなスクリプ ト系言語のプログラム例と言える。次のステップとして, grep/sed/awkな どのスクリプトで様々な目的に応じて各種フィルタを作成することを勧めた い。そして,本稿の最後として大型化したUNIXの申し子とも言えるスクリ プト系言語perlの紹介を行いたい。 -562 香川大学経済論叢 758 スクリプト系言語を一通り使いこなせば(筆者が使いこなしていると明言す るにはまさに蛮勇が必要であるが), UNIXユーザとしてある意味ではC言語 プログラマと互角であると言える。スクリプト系言語を自在にあやつることが できれば,恐らく UNIXパーワーユーザと呼んでも言い過ぎではないと思わ れる。少し極端な表現ながら,

C

言語プログラムを一切作成せず,スクリプト 系言語だけを利用していてもUNIXの魅力を十分理解できると言える。 UNIX の素晴らしい世界をより詳細に理解しようとすれば参考文献[2 ]が適してい ると思われる。訳本が多いUNIX関係の書籍の中で,日本人の手になる労作 としても評価が高い。 スクリプト系言語の魅力とは何か。誤解を恐れずに一言で言えば

J

簡潔な手 続きで,

C

言語プログラム以上の効果が期待できる』言語と表現することがで きる。簡潔な手続きは決して“単純(低級)"な手続きを意味しない。むしろ, 誰にとっても理解し易いという大きな利点を持っている。スクリプト系言語は C言語よりも多くのUNIXユーザにとってUNIXシステムを身近な存在に感 じさせる重要な役割を果たすことが可能である。これは筆者の持論であるが, UNIXのシステム管理などを行う場合, C言語より役に立つのはスクリプト 系言語であると言える[1 ]。それほどスクリプト系言語はUNIX自体にとっ ても必要不可欠な存在と言える。 スクリプト系言語をいろいろと利用していく上で導入部にはどの言語がいい か,もちろん一概には言えないが,筆者はまず

s

h

および

c

s

h

など,シェルと 呼ばれるコマンドインタープリタを勧めたい。理由は簡単,その利用範囲の広 さと簡潔さである。ほとんどのUNIXユーザが最初にお世話になるのがシェ ルであり,環境設定などのシェルスクリプトはもっともポピュラーなスクリプ ト系言語のプログラム例と言える。次のステップとして, grep/sed/awkな どのスクリプトで様々な目的に応じて各種フィルタを作成することを勧めた い。そして,本稿の最後として大型化したUNIXの申し子とも言えるスクリ プト系言語perlの紹介を行いたい。

(3)

759 UNIXにおけるスクリプト系言語の活用方法について 9 i U 6 F 3

2

.

プログラミングツールとしてのシェル シェ/レを利用していないUNIXユーザ、は少ない。『皆無』と表現すべきかも しれないが,筆者の周辺にも UNIXマシンの電子メイルサービスは利用する が,メイルを読み返事を書くためのメイラと呼ばれるソフトウェアは Win-dowsノTソコンやMacintosh上のクライアントソフトウェアを利用し, UNIX マシンにはpopperと呼ばれるデーモンプロセスにのみ依存するといったユー ザが急増し始めている。このような利用形態ではUNIXユーザとして認めな いという立場も可能であるが,やはり UNIXを普及させていく原動力のlつ であると認識すべきであることも事実であろう。一方,通常のUNIXユーザ では, telnetあるいはftpでログインする場合,シェルにお世話になっていな いとは言えない。 telnetはもちろんのこと, ftpでも先方のホストマシンへロ グインする時点、で先方のユーザのログインシェノレが何であるかの確認処理が行 われる。 香川大学情報処理センターに導入されている UNIXマシンは平成5年度末 の香川大学キャンパス情報ネットワークの構築時から UNIXのシステムV系 である。既定値としてのシェルはshであるが,システムのオプションとして cshやkshなどを指定することが可能である。 3つのドットファイルである “profile"と“login"および“cshrc"は前者がsh(あるいはksh)の初期化を, 後者の2つのファイノレがcsh (tcshも含まれる)の環境設定を行うのに使用さ れる。これらは総てシェルスクリプトであり,個人環境を自由にカスタマイズ するためにもシェルスクリプトをある程度自在に記述できることが望ましい。 シェ/レスクリプトは

MS-DOS

のパッチファイノレと類似している。正確に は

MS-DOS

がシェルスクリプトを模倣していると言うべきであるが。大き く異なる点は,

MS-DOS

のパッチプアイルが唯一のコマンドインタープリタ “command..com"で処理されるのに対し, UNIXでは個々のユーザのログイ ンシェノレとは無関係に様々な種類のシェルスクリプトを自由に利用できる。シ ェノレスクリプトの最初

l

行で処理対象となるシェJレを絶対ノfス表示する。

MS

759 UNIXにおけるスクリプト系言語の活用方法について

-563-2

.

プログラミングツールとしてのシェル シェ/レを利用していないUNIXユーザ、は少ない。『皆無』と表現すべきかも しれないが,筆者の周辺にも UNIXマシンの電子メイルサービスは利用する が,メイルを読み返事を書くためのメイラと呼ばれるソフトウェアは Win-dowsノfソコンやMacintosh上のクライアントソフトウェアを利用し, UNIX マシンにはpopperと呼ばれるデーモンプロセスにのみ依存するといったユー ザが急増し始めている。このような利用形態ではUNIXユーザ、として認めな いという立場も可能であるが,やはり UNIXを普及させていく原動力のlつ であると認識すべきであることも事実であろう。一方,通常のUNIXユーザ では, telnetあるいはftpでログインする場合,シェルにお世話になっていな いとは言えない。 telnetはもちろんのこと, ftpでも先方のホストマシンへロ グインする時点で先方のユーザのログインシェノレが何であるかの確認処理が行 われる。 香川大学情報処理センターに導入されている UNIXマシンは平成5年度末 の香川大学キャンパス情報ネットワークの構築時からUNIXのシステムV系 である。既定値としてのシェルはshであるが,システムのオプションとして cshやkshなどを指定することが可能である。 3つのドットファイルである “.profile"と“login"および“cshrc"は前者がsh(あるいはksh)の初期化を, 後者の2つのファイノレがωh (tcshも含まれる)の環境設定を行うのに使用さ れる。これらは総てシェルスクリプトであり,個人環境を自由にカスタマイズ するためにもシェルスクリプトをある程度自在に記述できることが望ましい。 シェ/レスクリプトは

MS-DOS

のパッチファイノレと類似している。正確に は

MS-DOS

がシェルスクリプトを模倣していると言うべきであるが。大き く異なる点は,

MS-DOS

のパッチファイルが唯一のコマンドインタープリタ “command..com"で処理されるのに対し, UNIXでは個々のユーザのログイ ンシェノレとは無関係に様々な種類のシェルスクリプトを自由に利用できる。シ エノレスクリプトの最初

l

行で処理対象となるシェJレを絶対ノfス表示する。

MS

(4)

564 - 香川大学経済論叢 760

-DOS

であればファイルの拡張子でバイナリファイノレかパッチファイルかが 判断される。

UNIX

ではシェノレスクリプトはコマンドインタープリタではな く

UNIX

カーネノレが処理し,シェノレスクリプトの第

1

行を基にシェルスクリ プトを解釈実行するインタープリタを呼び出してこれを実行させる。例えば, スクリプトの第

1

行が“非!/

usr/bin/ c

s

h

"

ならば

c

s

h

に,“非

!/usr/bin/

k

s

h

"

ならば

k

s

h

に実行させることになる。 筆者自身は

c

s

h

(と言うより

t

c

s

h

)

ユーザであり,シェノレスクリプトは

c

s

h

用がほとんどである。しかし,ログインシェルとは無関係にシェルスクリプト を利用できるので,

sh/ksh/bash

ユーザ、であっても

c

s

h

用シェルスクリプト を活用できる。同様に

c

s

h

ユーザであっても,例えば

k

s

h

用シェノレスクリプ トを利用することが可能である。

c

s

h

を活用するには参考文献[

3

]が,

k

s

h

な ら ば [

4

]が有効であると思われる。まず,筆者が毎日利用する

c

s

h

用シェ ノレスクリプトをいくつか紹介する。シェルスクリプトは多くの場合,パッチ処 理の記述に利用される。パッチ処理は

UNIX

TSS

指向の

OS

であり,会話 的にコマンド入力しながら処理を進めていく利用形態が中心であるためなおさ ら重要であると言える。 例えば,ネットワークを利用して別の

UNIX

マシン(リモートマシン)に ログインし,そのマシン上のファイルをこちらの

UNIX

マシン(ローカ/レマ シン)上にウインドウ表示させながらエディットしたい時には,コマンドプロ ンプトを“%"とすると

%

s

e

t

e

n

v

DISPLA

Y

o

u

r

M

a

c

h

i

n

e

:

0

.

.

0

% m

u

l

e

f

i

l

e

n

a

m

e

&

などとタイプすることになる。エディタの起動は頻度の多い操作であり, 2 つのコマンド行をタイプするだけとは言え繰り返しを回避する意味でパッチ処 理可能なスクリプトとして登録することが作業効率を向上させてくれる。

c

s

h

用シェノレスクリプトとして, 564 - 香川大学経済論叢 760

-DOS

であればファイルの拡張子でバイナリファイノレかパッチファイルかが 判断される。

UNIX

ではシェノレスクリプトはコマンドインタープリタではな く

UNIX

カーネノレが処理し,シェノレスクリプトの第

1

行を基にシェルスクリ プトを解釈実行するインタープリタを呼び出してこれを実行させる。例えば, スクリプトの第

1

行が“非!/

usr/bin/ c

s

h

"

ならば

c

s

h

に,“非

!/usr/bin/

k

s

h

"

ならば

k

s

h

に実行させることになる。 筆者自身は

c

s

h

(と言うより

t

c

s

h

)

ユーザであり,シェノレスクリプトは

c

s

h

用がほとんどである。しかし,ログインシェルとは無関係にシェルスクリプト を利用できるので,

sh/ksh/bash

ユーザ、であっても

c

s

h

用シェルスクリプト を活用できる。同様に

c

s

h

ユーザであっても,例えば

k

s

h

用シェノレスクリプ トを利用することが可能である。

c

s

h

を活用するには参考文献[

3

]が,

k

s

h

な ら ば [

4

]が有効であると思われる。まず,筆者が毎日利用する

c

s

h

用シェ ノレスクリプトをいくつか紹介する。シェルスクリプトは多くの場合,パッチ処 理の記述に利用される。パッチ処理は

UNIX

TSS

指向の

OS

であり,会話 的にコマンド入力しながら処理を進めていく利用形態が中心であるためなおさ ら重要であると言える。 例えば,ネットワークを利用して別の

UNIX

マシン(リモートマシン)に ログインし,そのマシン上のファイルをこちらの

UNIX

マシン(ローカ/レマ シン)上にウインドウ表示させながらエディットしたい時には,コマンドプロ ンプトを“%"とすると

%

s

e

t

e

n

v

DISPLA

Y

o

u

r

M

a

c

h

i

n

e

:

0

.

.

0

% m

u

l

e

f

i

l

e

n

a

m

e

&

などとタイプすることになる。エディタの起動は頻度の多い操作であり, 2 つのコマンド行をタイプするだけとは言え繰り返しを回避する意味でパッチ処 理可能なスクリプトとして登録することが作業効率を向上させてくれる。

c

s

h

用シェノレスクリプトとして,

(5)

761 UNIXにおけるスクリプト系言語の活用方法について 者!/

u

s

r

/bin/

c

s

h

i

f

(

$

#

argv= =0) t

h

e

n

e

c

h

o

Usage: "

$

0

F

i

l

e

n

a

m

e

"

e

l

s

e

s

e

t

e

n

v

DISPLA

Y myMachine :

0

.

0

mule $argv [* ]

&

e

n

d

i

f

図 2- 1 -565-なる記述のファイノレ

(

g

n

u

がファイノレ名)をリモートマシン上に作成する。こ れを

p

a

t

h

の通ったディレクトリに置き,“

chmod

+

x

gnu"

として実行可能属 性を付加する。これ以降,コマンド行で %

gnu f

i

l

e

n

a

m

e

などとタイプすれば,多国語対応の

GNU Emacs

の最新版“

mule"

をウインド

ウモードで起動で、きることになる。

c

s

h

用シェノレスクリプトの制御構造は基本 的に

C

言語に似ており,制御構文として“

i

f

-

t

h

e

n-else-endi

f'

while-e

n

d

"

,“

ioreach-end"

あるいは“

switch-case-breaksw-endsw"

ぐらいカま 理解されていれば,かなりの処理を

c

s

h

用シェノレスクリプトとして記述するこ とができる。 前述の例では引数が基本的に

1

つであるが,複数個の引数を扱う記述例も示 す。

Emacs

で電子メイルを読み,特定のファイノレにセーブする時,日本語な どは自動的に

J

I

S

コードでセ}プされる。そのファイルをポストスクリプト対 応のネットワークプリングに印刷する場合,日本語のコードを一度

EUC

に変 換する必要がある。漢字コードの変換処理には少し時間を要するものの,

UNIX

上および

MS-DOS

上のコード変換にはフリーウェア“

n

k

f

"

がよく利用され る。

n

k

f

はプラグ

(-e

I

-j

I

-s)

により,変換後のコード体系(E

UC

I

J

I

S

761 UNIXにおけるスクリプト系言語の活用方法について 者!/ usr/bin/ csh if ($

#

argv= =0) then echo “Usage: "$0“Filename" else setenv DISPLA Y myMachine : 0.0 mule $argv

[* ]

& endif 図 2- 1 -565-なる記述のファイノレ (gnuがファイノレ名)をリモートマシン上に作成する。こ れを pathの通ったディレクトリに置き,“chmod

+

x gnu"として実行可能属 性を付加する。これ以降,コマンド行で % gnu filename

などとタイプすれば,多国語対応のGNU Emacsの最新版“mule"をウインド ウモードで起動で、きることになる。 csh用シェノレスクリプトの制御構造は基本 的にC言語に似ており,制御構文として“if-then-else-endif",“ while-end",“ioreach-end"あるいは“switch-case-breaksw-endsw"ぐらいカま 理解されていれば,かなりの処理をcsh用シェノレスクリプトとして記述するこ とができる。 前述の例では引数が基本的に

1

つであるが,複数個の引数を扱う記述例も示 す。 Emacsで電子メイルを読み,特定のファイノレにセーブする時,日本語な どは自動的に

J

I

S

コードでセ}ブされる。そのファイルをポストスクリプト対 応のネットワークプリングに印刷する場合,日本語のコードを一度EUCに変 換する必要がある。漢字コードの変換処理には少し時間を要するものの,UNIX 上およびMS-DOS上のコード変換にはフリーウェア“nkf"がよく利用され る。 nkfはプラグ (-e

I

-j

I

-s)により,変換後のコード体系(EUC

I

JIS

(6)

-566- 香川大学経済論叢 762 │シフト JIS)を指定できる。コマンド行で

%

nkf -e filename.. jis>filename euc などとタイプすることになる。毎回このようにタイプするのも繁雑であり,コ ード変換前後の2つのファイノレ“filename..jis"と“filename..euc"が存在する のも邪魔な感じを与える。そこで,

%

nkf -e filename > temp temp; mv temp.. temp filename

として同一ファイル名となるよう操作する。同様の処理を複数のファイ/レにわ たって行う場合を想定して,次のようなcsh用シェルスクリプトを用意する。 すなわち, 再1/usr /bin/ csh if($非argv==0) then echo $0“can convert given file into the according EUC-file

"

echo “Usage: " $0“File Names Into EUC-style(s)" else if ($

#

argv > = 1) then foreach dest ($ {argv [1-$非argvJ}) nkf-e $dest > temp.. temp mv temp.. temp $dest end endif 図 2-2 である。これを少し修正すると,コード変換後にポストスクリプト対応のプリ ンタへ印刷する, -566- 香川大学経済論叢 762 │シフト JIS)を指定できる。コマンド行で

%

nkf -e filename.. jis>filename euc などとタイプすることになる。毎回このようにタイプするのも繁雑であり,コ ード変換前後の2つのファイノレ“filename..jis"と“filename..euc"が存在する のも邪魔な感じを与える。そこで,

%

nkf -e filename > temp temp; mv temp.. temp filename

として同一ファイル名となるよう操作する。同様の処理を複数のファイ/レにわ たって行う場合を想定して,次のようなcsh用シェルスクリプトを用意する。 すなわち, 再1/usr /bin/ csh if($非argv==0) then echo $0“can convert given file into the according EUC-file

"

echo “Usage: " $0“File Names Into EUC-style(s)" else if ($

#

argv > = 1) then foreach dest ($ {argv [1-$非argvJ}) nkf-e $dest > temp.. temp mv temp.. temp $dest end endif 図 2-2 である。これを少し修正すると,コード変換後にポストスクリプト対応のプリ ンタへ印刷する,

(7)

763 UNIXにおけるスクリプト系言語の活用方法について

-567-書!/ usr/bin/ csh if ($

#

argv= =0) then

echo $0“can convert into the EUC-file and print at PS printer" echo “Usage:" $0 “File NamesTo Be Printed At PS Printer(s)" else if($非argv>= 1)then foreach dest ($ {argv [1-$非argvJ}) nkf -e $dest>temp.. temp mv temp.temp $dest a 2 ps $dest

I

lpr -Pccp 1 ps end endif 図 2- 3 といったcsh用シェルスクリプトが作成できる。しかし,常にプリンタへ出力 するとは限らないとするとフラグで切替えて,コード変換のみを行うモード, あるいはコード変換してプリンタ出力するまでのモードのどちらかの処理を呼 び出すことを考える必要が発生する。フラグ“

c

"

でコード変換のみを,フラ グ“-p"あるいは“一1"でコード変換およびプリンタ出力を指定することにする。 非!/ usr /bin/ csh if(事者argv==0) then

echo $0 “can convert into the EUC-file, and print at PS printer" echo“Usage: " $0“[-cJ File Names Into EUC-file(s)"

echo “Usage: " $O"-p File Names To Be Printed At PS printer(s)" echo “Usage: " $0“

-1

File Names To Be Printed At 2 UP mode PS printer(s)" else if ($

#

argv> = 1) then switch ($argv [1J) case -p 763 UNIXにおけるスクリプト系言語の活用方法について -567-書!/ usr/bin/ csh if ($

#

argv= =0) then

echo $0“can convert into the EUC-file and print at PS printer" echo “Usage:" $0 “File NamesTo Be Printed At PS Printer(s)" else if($非argv>= 1)then foreach dest ($ {argv [1-$非argvJ}) nkf -e $dest>temp.. temp mv temp.temp $dest a 2 ps $dest

I

lpr -Pccp 1 ps end endif 図 2- 3 といったcsh用シェルスクリプトが作成できる。しかし,常にプリンタへ出力 するとは限らないとするとフラグで切替えて,コード変換のみを行うモード, あるいはコード変換してプリンタ出力するまでのモードのどちらかの処理を呼 び出すことを考える必要が発生する。フラグ“

c

"

でコード変換のみを,フラ グ“-p"あるいは“一1"でコード変換およびプリンタ出力を指定することにする。 非!/ usr /bin/ csh if(事者argv==0) then

echo $0 “can convert into the EUC-file, and print at PS printer" echo“Usage: " $0“[-cJ File Names Into EUC-file(s)"

echo “Usage: " $O"-p File Names To Be Printed At PS printer(s)" echo “Usage: " $0“

-1

File Names To Be Printed At 2 UP mode PS printer(s)"

else if ($

#

argv> = 1) then switch ($argv [1J)

(8)

568ー set pflag=l shift breaksw case -1 set pflag=2 shift breaksw case -c shift default breaksw endsw 香川大学経済論叢 foreach dest ($ {argv [l-$#argv]}) nkf -e $dest

>

temp.. temp mv temp.. temp $dest if ( $pflag= =2) then 2 UPa 2 ps -nn $dest [lpr-Pccp 1 ps else if ( $pflag = = 1) then a 2 ps $dest [ lpr -Pccp

1

ps endif end endif 図 2- 4 764 フラグ“

-c"

は省略可能であり,もし省略されれば第

1

引数からファイノレ名 と見なしてコード変換を行う。一方,フラグ“

-p

円あるいは“一

1

"

を指定する ことにより,コード変換後それぞれportraitモード(1頁分を 1枚に比較的 大きな文字で印刷)あるいはlandscapeモ ー ド (2頁分をl枚に比較的小さ 568ー set pflag=l shift breaksw case -1 set pflag=2 shift breaksw case一C shift default breaksw endsw 香川大学経済論叢 foreach dest ($ {argv [l-$#argvJ}) nkf -e $dest

>

temp.. temp mv temp.. temp $dest if ( $pflag= =2) then 2 UPa 2 ps -nn $dest [lpr-Pccp 1 ps else if ( $pflag = = 1) then a 2 ps $dest [lpr -Pccp

1

ps endif end endif 図 2- 4 764 フラグ“

-c"

は省略可能であり,もし省略されれば第

1

引数からファイノレ名 と見なしてコード変換を行う。一方,フラグ“

-p

円あるいは“一

1

"

を指定する ことにより,コード変換後それぞれportraitモード(1頁分を1枚に比較的 大きな文字で印刷)あるいはlandscapeモ ー ド (2頁分を l枚に比較的小さ

(9)

765 UNIXにおけるスクリプト系言語の活用方法について -569 な文字で印刷)でプリント処理を行う。この場合,ファイノレ名は第2引数から と見なされる。このように,フラグリこよる処理モードの切替えが可能となるシ ェノレスクリプトが容易に実現できる。 オプションフラグにより処理モードを明示的に切替える方法に対して,コマ ンド名自身で処理のフローを自動的に切替える方法がスマートであり,従来

UNIX

で上手に利用されてきたやり方と言える。そのようなシェノレスクリプ トの実現例および実行結果を図

2-5

に示す。

Script started on Sun Mar 522:49:491995 (aladdin)yos[11 1s -F MsDosElleAccessUtil MsDosF ileAccessUti 1*

(aladdin) yos [2J cat MsDosFileAcce5SUtil f! /usr/bin/csh

set comld - $0 if ( $Iargv 明 ・o ) then

swi tch ($comld)

case /home/yos/bin/readFD

echo $comld canどead SJIS-coded textfiles of MS-DOS from FD(2HD)" echo and canvert them エnto the same named EUC-coded textfiles ' echo "Usage: $comld "fileN,ame

breaksw

case /home/yos/bin/wri teFD

echo $comld "can convcどヒEU仁ーcoded text(ilcs inヒo SJIS一coded ones,o, echo " write them onto ED(2HD), and storc them ョs the same named MS-DOS f斗1eョ

echo Usage:' $comld "fileName breaksw case Ihome/yosfbin/lsED msdir /dev/rif!04 defaulヒ breaksw endsw

else if ( $Hargv >・1 ) then swi tch ( $com工dI

case Ihome/yos/binl readE D foreach dest ( $(argv{l-$骨argv)) )

msrcold /dev/rit/D4 $dest I stou -r > $dest end

breaksw c

.ase /home/yos/bin/wri teED foreョch dest ( $(argv(l-$併argv)} )

uヒos -rw $dest I mswnte Idev/rit/04 $dcst end

breaksw

cョse /home/yos/bin/lsED

e乙ho$c.omld "c.an report the contents of FD (2HD) ,

ec.ho " Usage: $c.omld defaul t

breaksw endsw

end~f

(a1addin) yoS (3] 1n -s MsDosF i 1eAcc.essUti 1 readEO

(aladd~n) yos(4) 1n -s MsDosEileAccessUt斗1 writefD (aladdェn)yos{5) ln -s MsDosFileAccessUtエ1 IsFO (aladdin)yos(6] Is-f

lsFD@ MsDosEileAccessUt~1" readFO@ writeEO@

765 UNIXにおけるスクリプト系言語の活用方法について -569-な文字で印刷)でプリント処理を行う。この場合,ファイノレ名は第2引数から と見なされる。このように,フラグによる処理モードの切替えが可能となるシ ェノレスクリプトが容易に実現できる。 オプションフラグにより処理モードを明示的に切替える方法に対して,コマ ンド名自身で処理のフローを自動的に切替える方法がスマートであり,従来

UNIX

で上手に利用されてきたやり方と言える。そのようなシェノレスクリプ トの実現例および実行結果を図

2-5

に示す。

Script started on Sun Mar 522:49:491995 (aladdin)yos[11 1s -F MsDosElleAccessUtil MsDosF ileAccessUti 1*

(aladdin) yos [2J cat MsDosFileAccessUtil f! /usrfbin/csh

set comld - $0 if ( $Iargv 珊 ・o ) then

swi tch ($comld)

case /home/yos/bin/readFD

echo $comld canどead SJIS-coded textfiles of MS-OOS from FD(2HD)" echo and canvert them エnto the same named EUC-coded textfiles ' echo "Usage: $comld "fileN,ame

breaksw

case /home/yos/bin/writeFD

eιho $comld "can convcどヒEU仁ーcoded text(ilcs inヒo SJIS-coded ones,o, echo " write them onto ED(2HD), and storc themヨs the same named MS-DOS f斗1eョ

echo Usage:' $comld "fileName breaksw case Ihome/yosfbin/lsED msdir /dev/rif/04 defaulヒ breaksw endsw

else if ( $併argv>・1 ) then

,.ユtch ( $com工dI case /home/yos/bin/ readE D

foreach dest ( $(argv{l-$骨argv)) ) msrcold /dev/rit/D4 $dest I stou -r > Sdest end

breaksw c

.ase /home/yos/bin/writeED foreョch dest ( $(argv(l-$併argv)} )

uヒos -rw Sdest I mswnte /dev/rif/04 Sdcst end

breaksw

cョse /home/yos/bin/lsED

e乙ho$c.omld "c.an report thc contents of FD (2HD) ,

ec.ho " Usage: $comld defaul t

breaksw endsw

end~f

(a1addin) yos (3] 1n -s MsDosF i leAccessUti 1 readED (aladdlO) yos(4) 1n -s MsDosEi1eAccessUt斗1 writefD (aladdエn)yos{5) 1n -s MsDosFi1eAccessUtエ1 lsFD (a1addin)yos(6) ls-f

(10)

-570ー 香川大学経済論叢

(a!addln) yos [7] readFD

/home/yos/bin/readED o.n read SJISー乙oded textfiles of MS-DOS from [ 0 (2HD) and convert them into the same named EUC-coded textfiles

Usage: /home/yos/bin/readED fileName (aladdin)yos{81 writeED

Ihome/yos/bin/writeED can convert EUC一coded textfj.lcsユnto SJIS-codcd ones,

write them onto ED(2HD), and sヒ。re them as the same named MS-DOS files Usage: /home/yos/bin/writcFD fileName

(aladdin) yos [9]、D

script donc on Sun M,:tr5 22:53:25 1995

766 シェノレスクリプトの実体は“

M

s

D

o

s

F

i

l

e

A

c

c

e

s

s

U

t

i

l

"

という名のファイルであ り,それを

3

つのコマンドエントリ,すなわち,“

r

e

a

d FD"

,“

w

r

i

t

e

FD"

, および“

I

s

F

D

"

にシンボリックリンクして利用している。コマンドエントリ

(

r

e

a

d

F

D

I

w

r

i

t

e

F

D

I

I

s

F

D

)

の内,いずれかの名でスクリプト“

M

s

D

o

s

F

i

l

e

A

c

-c

e

s

s

U

t

i

l

"

が呼び出されることにより,それぞれ 1)コマンドエントリが“

r

e

a

dFD"

であれば,

MS-DOS

でフォーマット されたフロッピーディスクからテキストアァイルを読み上げ,

MS-DOS

から

UNIX

へコード変換し,

UNIX

のファイルとしてカレントデ

ィレクトリに書き込む

2

)コマンドエントリが“

w

r

i

t

eFD"

であれば,

UNIX

のテキストファイノレ をカレントディレクトリから読み上げ,

UNIX

から

MS-DOS

へコード 変換し,

MS-DOS

でフォーマットされたフロッピーディスクに書き込 む

3

)コマンドエントリが“

I

s

F

D

"

であれば,

MS-DOS

でフォーマットされ たフロッピーディスクのディレクトリ表示を行う といった機能を実現させることができる。 本稿はスクリプトを中心に論じており,図

2-5

の例でも

1

つのスクリプ ト実体へ複数コマンドエントリをシンボリックリンク(ハードリンクでも同 じ)してコマンド名で処理の流れをスイッチし,複数の機能を切替えて利用す -570ー 香川大学経済論叢

(a!addln) yos [7] readFD

/home/yos/bin/readED o.n read SJIS乙oded textfiles of MS-DOS from [ 0 (2HD) and convert them into the same named EUC-coded textfiles

Usage: /home/yos/bin/readED fileName (aladdin)yos{81 writeED

Ihome/yos/bin/writeED can convert EUC-coded textfjlcsユnto SJIS-codcd ones, write them onto ED(2HD), and sヒ。re them as the same named MS-DOS files Usage: /home/yos/bin/writcFD fileName

(aladdin) yos [9]、D

script donc on Sun M,:tr5 22:53:25 1995

766 シェノレスクリプトの実体は“

M

s

D

o

s

F

i

l

e

A

c

c

e

s

s

U

t

i

l

"

という名のファイルであ り,それを

3

つのコマンドエントリ,すなわち,“

r

e

a

d FD"

,“

w

r

i

t

e

FD"

, および“

I

s

F

D

"

にシンボリックリンクして利用している。コマンドエントリ

(

r

e

a

d

F

D

I

w

r

i

t

e

F

D

I

I

s

F

D

)

の内,いずれかの名でスクリプト“

M

s

D

o

s

F

i

l

e

A

c

-c

e

s

s

U

t

i

l

"

が呼び出されることにより,それぞれ 1)コマンドエントリが“

r

e

a

dFD"

であれば,

MS-DOS

でフォーマット されたフロッピーディスクからテキストアァイルを読み上げ,

MS-DOS

から

UNIX

へコード変換し,

UNIX

のファイルとしてカレントデ

ィレクトリに書き込む

2

)コマンドエントリが“

w

r

i

t

eFD"

であれば,

UNIX

のテキストファイノレ をカレントディレクトリから読み上げ,

UNIX

から

MS-DOS

へコード 変換し,

MS-DOS

でフォーマットされたフロッピーディスクに書き込 む

3

)コマンドエントリが“

I

s

F

D

"

であれば,

MS-DOS

でフォーマットされ たフロッピーディスクのディレクトリ表示を行う といった機能を実現させることができる。 本稿はスクリプトを中心に論じており,図

2-5

の例でも

1

つのスクリプ ト実体へ複数コマンドエントリをシンボリックリンク(ハードリンクでも同 じ)してコマンド名で処理の流れをスイッチし,複数の機能を切替えて利用す

(11)

767 UNIXにおけるスクリプト系言語の活用方法について -571-ることのできる実現手法の事例を具体的に示している。このような方法によ り,同一コード(すなわち単一の実体)を複数のコマンドに見せ掛けることが できることになる。 UNIXユーザ、の聞では有名な話の1つである,コマンド “compress"および“uncompress"という圧縮および解凍(展開)ソフトウェ アも同一プログラムコードであり,呼び出すコマンド名で機能を切替えて実行 させている。一方, MS-DOSやUNIXでも有名な“lha"と呼ばれるアーカ イバソフトウエアも圧縮・解凍機能を備えているが,こちらの方はコマンド名 ではなくフラグで機能を切替えており,本稿における図2- 4の実現方法に相 当している。一般にバイナリコードはファイJレサイズも大きく別個のファイル として存在させればディスク容量をそれだけ占有する上に,機能的に類似して いればまとめて管理保存しておく方が都合がよいのは明らかである。そこでこ のように実体を

1

つにしておく実現手法も効果的であると言える。バイナリコ ードに限らず, (シェル)スクリプトであっても同様のことが当てはまる。こ のような手法が可能な点も UNIXのスマートさであると感じるのは筆者だけ ではないと思われるがいかがだろうか。 次はスマートだった頃(?)のUNIXが最も寸八番(おはこ)としていたフ ィルタ記述に適したスクリプト系言語てやあるgrep,sedおよびawkなどを用 いて実現したスクリプトの具体例を示す。 3 フィノレタ記述に適したgrep/sed/awkのスクリプト UNIXは開発当時から文字列処理を含む文書処理をターゲツト分野に想定 していたよう℃ある。文字列処理などはC言語プログラムにとっても得意な 範時である。しかし,文字列処理にはフィルタが有効であり,そのような処理 ではやはりフィルタ記述に適したgrep,sedあるいはawkなどの組み合わせ が有効であると言える。比較的小さな規模であれば,わざわざC言語でプロ グラミングをする気になれないのも事実である。 awkスクリプトを作成する 場合, awkの 開 発 者 自 ら が 著 し た [5 ]が最適な参考文献の1つである。ま た,“sed+awk"の組み合わせてす利用する場合は[6 ]も参考文献として有効 767 UNIXにおけるスクリプト系言語の活用方法について -571-ることのできる実現手法の事例を具体的に示している。このような方法によ り,同一コード(すなわち単一の実体)を複数のコマンドに見せ掛けることが できることになる。 UNIXユーザ、の聞では有名な話の1つである,コマンド “compress"および“uncompress"という圧縮および解凍(展開)ソフトウェ アも同一プログラムコードであり,呼び出すコマンド名で機能を切替えて実行 させている。一方, MS-DOSやUNIXでも有名な“lha"と呼ばれるアーカ イバソフトウェアも圧縮・解凍機能を備えているが,こちらの方はコマンド名 ではなくフラグで機能を切替えており,本稿における図2- 4の実現方法に相 当している。一般にバイナリコードはファイルサイズも大きく別個のファイル として存在させればディスク容量をそれだけ占有する上に,機能的に類似して いればまとめて管理保存しておく方が都合がよいのは明らかである。そこでこ のように実体を

1

つにしておく実現手法も効果的であると言える。バイナリコ ードに限らず, (シェル)スクリプトであっても同様のことが当てはまる。こ のような手法が可能な点も UNIXのスマートさであると感じるのは筆者だけ ではないと思われるがいかがだ、ろうか。 次はスマートだった頃(?)のUNIXが最も寸八番(おはこ)としていたフ ィルタ記述に適したスクリプト系言語"f:'ある grep,sedおよびawkなどを用 いて実現したスクリプトの具体例を示す。 3.フィノレタ記述に適したgrep/sed/awkのスクリプト UNIXは開発当時から文字列処理を含む文書処理をターゲット分野に想定 していたよう℃ある。文字列処理などはC言語プログラムにとっても得意な 範時である。しかし,文字列処理にはフィルタが有効であり,そのような処理 ではやはりフィルタ記述に適したgrep,sedあるいはawkなどの組み合わせ が有効であると言える。比較的小さな規模であれば,わざわざC言語でプロ グラミングをする気になれないのも事実である。 awkスクリプトを作成する 場合, awkの 開 発 者 自 ら が 著 し た [5 ]が最適な参考文献の1つである。ま た,“sed+awk"の組み合わせてす利用する場合は[6 ]も参考文献として有効

(12)

- 5穴2 香川大学経済論叢 768 であろう。 シェルスクリプトとawkなどのスクリプトとは, インタープリタて、あるsh /cshやsed/awkが解釈実行するという本質的な部分では大差がないもの の,シェルスクリプトの実現スタイルと awkなどのスクリプトのそれとは一 部異なっている。より正確に表現すると,シェルが会話型処理および、パッチ型 処理の両方が可能で、あるのに対して, sedスクリプトやawkスクリプトなど では基本的にパッチ型処理のみである。これはgrepやper1などにも言えるこ とである。 スクリプトの実現スタイルは大別すると, 1 )コマンド行にスクリプトを明示的に記述するモード,および 2 )ファイル内にスクリプトをパッチ処理として記述するモード が可能である。本稿では1)の方を『コマンド行スクリプト記述モード』と呼 ぴ, 2)の方を『ファイノレ内スクリプト記述モード』と呼んで区別して扱うこ とにする。 両者の表現比較を表 3- 1に示す。 通 3-1 コマンド行スクリプト記述モードvs7アイル向スクリプト記述モード ,edのスクリプト例 盟主2るとヰと盟

コマンド行 I sed -e s/'t"I/g I awk -F, 'SEGIN (aBlood・0)苛

スクリプト 記述モード

$6‘/^B型I(print'Vt',れI Yt!", $6,け1・; aBlood +・1)苛l

END {printf ( 吋 日 ヒ 合 計 制 名 VnVn",aBlood)}・

ファイル内 I ・.fusr/bin/sed -f I ・・lusr/bin/awk -f

スクリプト I '/"//9 I BEGIN (E$・",";aBlood・0)

記述モード $6陶 /^B型 / (p口nt吋ヒ", $1, 吋 t[", $6, "J前 aBlood+・1)

END {printf{吋tVt合計 %d名VnVn"I aBloodl

[注]コマンド行スクリプト記述モード コマンド行にスクリプトを明示的に記述するモード ファイル内スクリプト記述モード・ファイル内にスクリプトをパッチ担理的に記述するモード 『コマンド行スクリプト記述モード』の利点は比較的短いスクリプトを記述 する場合に効果がある。表現が簡潔であり,頻繁に利用する記述を記憶してお けば必要になった時点でコマンド行に記述することができる点が大きな特徴で - 5穴2 香川大学経済論叢 768 であろう。 シェルスクリプトとawkなどのスクリプトとは, インタープリタて、あるsh /cshやsed/awkが解釈実行するという本質的な部分では大差がないもの の,シェルスクリプトの実現スタイルと awkなどのスクリプトのそれとは一 部異なっている。より正確に表現すると,シェルが会話型処理および、パッチ型 処理の両方が可能であるのに対して, sedスクリプトやawkスクリプトなど では基本的にパッチ型処理のみである。これはgrepやperlなどにも言えるこ とである。 スクリプトの実現スタイルは大別すると, 1 )コマンド行にスクリプトを明示的に記述するモ)ド,および 2 )ファイル内にスクリプトをパッチ処理として記述するモード が可能である。本稿では1)の方を『コマンド行スクリプト記述モード』と呼 ぴ, 2)の方を『ファイノレ内スクリプト記述モード』と呼んで区別して扱うこ とにする。 両者の表現比較を表 3- 1に示す。 通 3-1 コマンド行スクリプト記述モードvs7ァイル向スクリプト記述モード ,edのスクリプト例 盟主2るとヰと盟

コマンド行 I sed -e s/'t"I/g I awk -F, 'SEGIN {aBlood - O}苛

スクリプト 記述モード

$6‘/^B型I(print'Vt',れI 'It!", $6, "]・;aBlood +・1)苦l END {printf (吋日ヒ合計ーもd名VnVn",aBlood)}・

ファイル内 I

.

fusr/bin/sed -f I

lusr/bin/awk -f スクリプト I 5/"//9 I BEGIN (ES -",";aBlood・0) 記述モード $6陶 /^B型 / Ip口nt吋ヒ", $1,

END {printf{吋tVt合計 %d名VnVn"I aBloodl

[注]コマンド行スクリプト記述モード:コマンド行にスクリプトを明示的に記述するモード ファイル内スクリプト記述モード:ファイル内にスクリプトをパッチ担理的に記述するモード

『コマンド行スクリプト記述モード』の利点は比較的短いスクリプトを記述 する場合に効果がある。表現が簡潔であり,頻繁に利用する記述を記憶してお けば必要になった時点でコマンド行に記述することができる点が大きな特徴で

(13)

769 UNIXにおけるスクリプト系言語の活用方法について -573 ある。一方ファイノレ内スクリプト記述モード』の場合,全体の処理フロー が理解し易いばかりか,スクリプトがかなり大きなサイズになってもコマンド 行に記述する場合の制限を感じないで記述できるなど利点も多い。もちろん, 一度ファイノレとしてセーブし, chmodで実行可能属性を付加したり,実行時 にファイJレからスクリプトを読み込むローディングタイムが必要となるなど, わずかであれオーバーヘッドが生じるものの,ほとんど無視できる範囲とも言 える。 具体的な事例を示す。あるディレクトリに存在する複数のテキストファイJレ 中に特定の文字列が含まれているとする。どのファイルに目的の文字列が含ま れているか,予め分かつていればそのファイルをviやEmacsなどのエディタ で編集すれば済む。しかし,どのファイルに目的の文字列が含まれるかが分か らない場合も多く,仮に分かつていたとしても編集するファイルが多ければや はり会話型エディタでは処理や操作が繁雑で効率がよいとはとても言えない。 そこで,スクリプトを利用した処理が有効となる。問題を少し具体的にするため, 置換対象となる可能性を持つファイルをaaa.txt, bbh. txt, ccc txt, ddd. txし およびeeeυtxtとする。 検索対象となる文字列は“abcd"とし,置換後の文字列を“imai"とす る。 置換対象ファイル中に検索対象文字列“abcd"が存在するかどうかを検 索し,それらを総て

i

置換文字列“imai"で置き換える。 という条件を設定する。もちろん,これらの制限は処理を 般化する過程では 取り除く。次のような手順で上記の問題の処理を試みることにする。すなわち, 1) grepで検索対象文字列が置換対象となる可能性を持つファイル群の中 に存在するかどうか確認する。 2) awkで実際に置換対象となるファイノレ群のファイル名を決定しリスト 769 UNIXにおけるスクリプト系言語の活用方法について -573 ある。一方~.ファイノレ内スクリプト記述モード』の場合,全体の処理フロー が理解し易いばかりか,スクリプトがかなり大きなサイズになってもコマンド 行に記述する場合の制限を感じないで記述できるなど利点も多い。もちろん, 一度ファイノレとしてセーブし, chmodで実行可能属性を付加したり,実行時 にファイJレからスクリプトを読み込むローディングタイムが必要となるなど, わずかであれオーパーヘッドが生じるものの,ほとんど無視できる範囲とも言 える。 具体的な事例を示す。あるディレクトリに存在する複数のテキストファイJレ 中に特定の文字列が含まれているとする。どのファイルに目的の文字列が含ま れているか,予め分かつていればそのファイルをviやEmacsなどのエディタ で編集すれば済む。しかし,どのファイルに目的の文字列が含まれるかが分か らない場合も多く,仮に分かつていたとしても編集するファイルが多ければや はり会話型エディタでは処理や操作が繁雑で効率がよいとはとても言えない。 そこで,スクリプトを利用した処理が有効となる。問題を少し具体的にするため, 置換対象となる可能性を持つファイルをaaa.txt, bbh. txt, ccc txt, ddd. txし およびeeeυtxtとする。 検索対象となる文字列は“abcd"とし,置換後の文字列を“imai"とす る。 置換対象ファイル中に検索対象文字列“abcd"が存在するかどうかを検 索し,それらを総て置換文字列“imai"で置き換える。 という条件を設定する。もちろん,これらの制限は処理を 般化する過程では 取り除く。次のような手順で上記の問題の処理を試みることにする。すなわち, 1) grepで検索対象文字列が置換対象となる可能性を持つファイル群の中 に存在するかどうか確認する。 2) awkで実際に置換対象となるファイノレ群のファイル名を決定しリスト

(14)

-574 香川大学経済論叢 770 アッ、プするO

3

)同一ファイノレ中に検索対象文字列が複数回含まれる場合を想定し, uniq でファイル名のリストを整理する。

4

)置換操作を

s

e

d

で実現するため,

awk

s

e

d

を含むコマンド系列を自 動生成する。

5

)生成されたコマンド系列を実行する。

Script staどとed on Sat Mar 18 17:29:17 1995 (aladdin)yos[lJ 1s aaa txt ccc txt bbb txt ddd txt (aladdin)yos(2) 1s -1 総プロック教12 1 yos other 1 yos other 1 yos other 1 yos other 1 yos other eee txヒ ヲrep+sed+awk csh* go@ 15 3月18日17時 17分aaa txt 19 3月 四 日 17時 17分bbb txt 28 3月18日 17時17分ccc txt 15 3月18日 17時17分ddd txt 24 3月18日17時17分eee txt

lrwxrwxrwx 1 yos other 16 3月18日16時 日 分 goー)>grep+sed+awk csh*

1 yos other 123 3月18日 16時 35分grep+scd+ョwk csh*

(aladdlo)yos[3J cat . txt .. abcd 1234 ABCD 5678 AAabcdEE WXYZ 1234 abcd = 慣aaa txt 担 司 -- bbb txt 胃 罰 ー-ccc txt ・・ 5678 WXYZabcd1234 1234 5678 ABCD abcd ABCD ABCDabcd 1234 -- ddd, txt --ー-eee txt

--(aladdinlyos!4J grep abcd ... txt aaa, txt:abcd bbb tx:乞:AAabcdEE ccc, txt:abcd ccc, txt:WXYZabcd1234 eee, txt:abcd eee, tx乞ABCDahcd

(aladdin)yos[5J grep abcd '1<txt I awk -E: '{print $l}・ aaa, txt bbb, txt ccc txt ccc txt eee乞xt eee乞xt -574 香川大学経済論叢 770 アップするO

3

)同一ファイノレ中に検索対象文字列が複数回含まれる場合を想定し, uniq でファイル名のリストを整理する。 4)置換操作をsedで実現するため, awkでsedを含むコマンド系列を自 動生成する。

5

)生成されたコマンド系列を実行する。

Script staどとed on Sat Mar 18 17:29:17 1995 (aladctin)yos[l] 1s aaa txt ccc txt bbb txt ddd txt (aladdin)yos(2) 1s -1 総プロック教12 1 yos other 1 yos other 1 yos other 1 yos other 1 yos other eee txヒ ヲrep+sed+awk csh* go@ 15 3月18日17時 17分 aaa txt 19 3月 四 日17時 日 分 bbb txt 28 3月18日 17時17分ccc txt 15 3月18日 17時17分ddd txt 24 3月18日17時17分eee txt

lrwxrwxrwx 1 yos other 16 3月18日16時 打 分 go-)> grep+sed+awk csh*

1 yos other 123 3月18日 16時 35分 grep+scd+ヨwk csh*

(aladdlo)yos[3J cat ... txt abcd 1234 ABCD 5678 AAab乙dEE WXYZ 1234 abcd = 慣aaa txt 担 司 -- bbb txt 胃 罰 ー-ccc txt ・・ 5678 WXYZabcd1234 1234 5678 ABCD abcd ABCD ABCDabcd 1234 -- ddd, txt 罰 事 ー-eee txt

--(aladdinlyos!4J grep abcd .. txt . aaa, txt:abcd bbb tx:乞:AAabcdEE ccc, txt:abcd ccc, txt:WXYZabcd1234 eee, txt:abcd eee, tx乞:ABCDahcd

(aladdin)yos[5J grep abcd '1<txt I awk -E: '{print $l}・

aaa, txt bbb, txt ccc txt ccc txt eee乞xt eee乞xt

(15)

771 UNIXにおけるスクリプト系言語の活用方法について -575-(aladdin) yos 16) 守!! unlq

grep abcd ・ヒ xt I awk -F: {pr孟nt $l} I unエq aaa. txt bbb, txt 1 5 9 / l a m

-/ d h a / s e d e s } 1 t s n l r p q d , 、 / ' l a k m w l a / A U t -C 1 D q a -/ n s u e -d } e 1 s s 乞 t n n 主 l r r p P { t t t 乞 { ' x x x x t l t t t t x ' t k F a b c e w -a b c e c a a b c e c k c lwqqdqqd a / / / / t ﹃ 、 A l a -a 4 m m m m c ] 乞 L I L -7 X / / / / 8 1 t d d d d I S C C C C S 0

b b b b o y a a a a y } d / / / / } n e s s s s n t t ユ b l x x d a e e e e d 乞 ヒ d -d a p a 4 d 8 c e l e d d d d l 3 C 7 c e a x e e e e a 2 b 6 c e { g s s s s { l a s WXYZabcd1234

(aladdin) yos [9) sed -e s/a.bcd/iroai/g ccc txヒ 1234

5678 WXYZimaェ1234

(aladdエn)yos(10) grep abcd合 txt I awk -F: '{print Sl}' I uniq I 'i

awk '{printf ("scd -e s/abcd/imai/ヲも, >ヒemp tcmp; mv temp temp亀S菅n",$1, $1))' sed -c s/abcd/imaエ/g a3a乞xt >temp, temp~ mv temp temp aaa txt

sed -e s/abcd/imai/g bbb txt >temp, temp: mv temp tcmp bbb txt scd -e s/abcd/ima且19ccc txt >terop temp: mv temp temp ccc txt sed -e s/abcd/imai/g eee txt >temp temp: mv temp temp ccc txt

(aladdin) yos (11) 1s -1 総プロック数日

1 yos other 15 3月 18日17時 日 分 a日 txt 1 yos ヒher 19 3月 四 日17時17分bbb txt 1 yos othcr 28 3月18日17時17分ccc txt 1 yos othcr 15 3月18日17時17分ddd txt -rw-rー ト 1 yos other 24 3月 18日17時 17分 間e txt

lrwxrwxrwx 1 yos othcr 16 3月 18日 16時 31分goー>grep+scd+awk csh" 1 yos other 162 3月18日16時 35分grep+sed+awk csh" (aladdin)yos(121 cat go

脅!/usr/bin/csh

grep ,$argv(11 $argv(31 I awk-F・ 守{pどint $1}' I uniq I省

awk (prinヒf("sed -e s/$argv[11/$argv[21/g'令s >tcmp temp 宝

mv temp temp主sVn",$1, $1) } (aladdin) yos [13] go abcd imai ¥" txt

t t t ヒ x x x x t t t t a b c e a b c e a b e e p p p p m m m m e e e e t t t t pppp・ m m m m e e e e t t t t v v v v m m m m p p l p p p P 5 m m m m 9 e e e e 9 t t t t l p p p p o m m m m o e e e e : t t t t 4 ﹀ ﹀ ﹀ ﹀ 4 t t t t 7 x x x X 1 t t t ヒ 8 a b e e -a b c e 2 2 b e e r a q g q q M / / / / D ーェ、 A 1 4 内 t a a a a a m m m m I s -I 1 4 / / / / 1 n d d d d I 0 c c c c s b b b b

e a a a a y n / / / / } O s s s s n d L e e e e d t a -d p a l d d d d l r e e e e a c s s s s { S 図3-1 となる。以上の処理過程をscr旬tコマンドで記録したものが図3- 1である。 コマンドを順次ノfイプラインで繋げていくことで処理を進めている。 cshスク リプトとして実現することで

2

行にもわたる長いパイプライン記述もコマン ド行への引数受渡しを巧みに行うことが可能となる。その結果,かなり汎用性 771 UNIXにおけるスクリプト系言語の活用方法について

-575-(aladdin) yos 16) 守!! uniq

grep abcd ・ヒxt I awk -F: {pr孟nt $l} I unエq aaa. txt bbb, txt 1 5 α J / 五 回 、 ム / A u h a / s e d e s } 1 t s n l r p q d , 、 / ' l a k m w l a / d l 出 q a -/ n s u e -d } e 1 s s 乞 t n n 主 l r r p P { t t t 乞 { ' x x x x t t t t t x t k F a b c e w -a b c e c a a b c e c k c l w q g q g a / / / / t ﹃ 、 A l a -a 4 l a a a a c m m m m l 乞 L l i -7 X / / / / 8 1 t d d d d I S C C C C S 0

b b b b o y a a a a y } d / / / / } n e s s s s n t t ユ b -x x d a e e e e d 乞 ヒ d -d a p a 4 d 8 c e l e d d d d l 3 C 7 c e a x e e e e a 2 b 6 c e { g s s s s { l a s WXYZabcd1234

(aladdin) yos [9) sed -e s/a.bcd/iroai/g ccc txヒ 1234

5678 WXYZimaェ1234

(aladdユn)yos(10) grep abcd合 txt I awk -F: '{print Sl}' I uniq I 'i

awk '{printf ("scd -e s/abcd/imai/gも,>ヒemp tcmp; mv temp temp亀s菅n",$1, $1))' sed -c s/abc:d/imaエ/9 a3a乞xt >temp, temp: mv temp temp aaa txt

sed -e s/abcd/imai/g bbb txt >temp, temp: mv temp tcmp bbb txt

scd -e s/abcd/ima且19ccc txt >temp temp: mv temp temp ccc txt sed -e s/abcd/imai/g eee txt >temp temp: mv temp temp ccc txt

(aladdin) yos (11) 1s -1 総プロック数日 eR h s c k d * a h ム γ s d c e s k + w p ヨ e + ど d t t t t t q e x x x x x s t t t t t ﹀ + -P 3 b c d e e a b e d e o z a b e d e q q 分 分 分 分 分 分 分 7 7 7 7 7 7 5 1 1 1 1 1 3 3 時 時 時 時 時 時 時 7 7 7 7 7 6 6 1 1 1 1 1 1 1 口 μ 門口門口門口門ロロ M 門 口 8 8 8 8 8 8 8 1 1 1 1 1 1 1 白 川 RnRM 同 月 四 月 同 月 間 n 3 3 3 3 3 3 3 5 9 8 5 4 6 2 1 1 2 1 2 1 6

-x r r x r r r e e c e e e e h h h h h h h t ヒ t t t t t 。 。 。 。 。 。 。 s s s s s s s 。 。 。 。 。 。 。 y y y y y y Y 1 1 1 1 1 1 1 -m x x -w -z z z r -x x -w -E X E r -x x w w w w z x E z -l -(aladdin)yos(121 cat go 脅!/usr/bin/csh

grep ,$argv[l) Sargv[31 I awk -F: 守{pど斗nt $1}' I uniq I 省

awk (prinヒf("sed -e s/$argv[11/$argv(21/g' 毛5>tcmp temp: Y mv temp temp主sVn",$1, $1) }

(aladdin) yos [13] go abcd imai ¥* txt

t t t ヒ x x x x t t t t a b c e a-bce a-pee p p p p m m m m e e e e t t t t p p p p m m m m e e e e t t t t v v v v m m m m p p p P 5 m m m m 9 e e e e 9 t t 乞 t l p p p p o m m m m o e e e e : t t t t 4 ﹀ ﹀ ﹀ ﹀ 4 t t t t 7 x x x X 1 t t t ヒ 8 a b e e -a b c e 2 b e e r a q g q q M / / / / D ー ェ 、 A 1 4 内 t a a a a a m m m m I s -i 1 4 / / / / 1 n d d d d I 0 c c c c s b b b b

e a a a a y n / / / / } O s s s s n d L e e e e d t a -d p a l d d d d l r e e e e a c s s s S { S 図3-1 となる。以上の処理過程を

s

c

r

i

p

t

コマンドで記録したものが図

3-1

である。 コマンドを順次ノfイプラインで繋げていくことで処理を進めている。

c

s

h

スク リプトとして実現することで

2

行にもわたる長いパイプライン記述もコマン ド行への引数受渡しを巧みに行うことが可能となる。その結果,かなり汎用性

参照

関連したドキュメント

しかし,物質報酬群と言語報酬群に分けてみると,言語報酬群については,言語報酬を与

「系統情報の公開」に関する留意事項

2 学校法人は、前項の書類及び第三十七条第三項第三号の監査報告書(第六十六条第四号において「財

健康維持・増進ひいては生活習慣病を減らすため

[r]

授業設計に基づく LUNA の利用 2 利用環境について(学外等から利用される場合) 3 履修情報が LUNA に連携するタイミング 3!.

5月 こどもの発達について 臨床心理士 6月 ことばの発達について 言語聴覚士 6月 遊びや学習について 作業療法士 7月 体の使い方について 理学療法士

続いて川崎医療福祉大学の田並尚恵准教授が2000 年の