_Vol17No4.indd

Similar documents
ソフトウェア基礎 Ⅰ Report#2 提出日 : 2009 年 8 月 11 日 所属 : 工学部情報工学科 学籍番号 : K 氏名 : 當銘孔太

シェルプログラミング コマンドをパイプでつなげるだけでは済まないような ある程度まとまった処理を複数のコマンドを制御構文を用いたりしてファイルとしたものを ( シェル ) スクリプトと呼ぶ シェルプログラム バッチなどともいう.bash_profile もシェルスクリプトなので このファイルを解読し

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

_unix_text_command.pptx

プレポスト【解説】

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

PowerPoint Presentation

フィルタとは

PowerPoint Presentation

PowerPoint Presentation

スライド 1

ポインタ変数

Taro-cshプログラミングの応用.jt

このルールをそのまま正規表現として書くと 下記のようになります ^A[0-9]{2}00[0-9]{3}([0-9]{2})?$ ちょっと難しく見えるかもしれませんが 下記のような対応になっています 最初 固定 年度 固定 通番 ( 枝番 ) 最後 ルール "A" 数字 2 桁 0 を 2 桁 数字

Microsoft Word - no103.docx

3.Cygwin で日本語を使いたい Cygwin で以下のコマンドを実行すると それ以降 メッセージが日本語になります export LANG=ja_JP.UTF-8 これは 文字コードを日本語の UTF-8 に設定することを意味しています UTF-8 は Cygwin で標準の文字コードで, 多

基礎プログラミング2015

Microsoft PowerPoint - スハ?コン利用入門_ _UNIX利用の基礎知識.pptx

Microsoft Word - CygwinでPython.docx

このうち ツールバーが表示されていないときは メニューバーから [ 表示 (V)] [ ツールバー (T)] の [ 標準のボタン (S)] [ アドレスバー (A)] と [ ツールバーを固定する (B)] をクリックしてチェックを付けておくとよい また ツールバーはユーザ ( 利用者 ) が変更

Microsoft PowerPoint - Borland C++ Compilerの使用方法(v1.1).ppt [互換モード]

Microsoft Word - VBA基礎(6).docx

Microsoft PowerPoint - prog04.ppt

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Word2013基礎 基本操作

memo

<4D F736F F F696E74202D E3F FC96E55F F554E CC8AEE D8EAF2E B8CDD8AB B83685D>

PowerPoint プレゼンテーション

Si 知識情報処理

Microsoft Word - Training10_プリプロセッサ.docx

PowerPoint プレゼンテーション

kantan_C_1_iro3.indd

ガイダンス

Excel2013 データベース1(テーブル機能と並べ替え)

JavaScriptで プログラミング

PowerPoint プレゼンテーション

PowerPoint Presentation

JavaプログラミングⅠ

Microsoft PowerPoint - 第3回目.ppt [互換モード]

演算増幅器

ポインタ変数

PowerPoint プレゼンテーション

1. はじめに 1. はじめに 1-1. KaPPA-Average とは KaPPA-Average は KaPPA-View( でマイクロアレイデータを解析する際に便利なデータ変換ソフトウェアです 一般のマイクロアレイでは 一つのプロー

第 3 回情報基礎演習 UNIX / Linux: ファイルシステム シェルを理解しよう! 谷口貴志 Panda に login し 情報基礎演習クラスの VDI から Ubuntu に接続し Linux に login した後, 左 上の Activity 端末のアイオン をクリック 端末 を立ち

CONTENTS マニュアルの表記... S01-02_01 1.DataNature Smart 全体概要図... S01-02_11 2. 基本操作... S01-02_ ジョブの作成... S01-02_21 加工条件設定... S01-02_21 Step1: 処理対象データの指

PowerPoint Presentation

譲渡人複数証明データコンバータ操作説明書 平成 26 年 6 月

prg.indb

コンピュータグラフィックス基礎              No

Microsoft PowerPoint - prog03.ppt

情報処理概論(第二日目)

PowerPoint プレゼンテーション

GSLetterNeo vol 年 7 月 形式手法コトハジメ TLA + Toolbox を使って (2)- 熊澤努 sra.co.jp はじめに GSLetterNeo Vol.130 で TLA + Toolbox を紹介しました 今回からより詳しく T

PowerPoint プレゼンテーション

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

データバー を例にとって解説します 数値の入っているセル範囲 G2:I16 をすべて選択した状態で [ ホーム ] 2

4 分岐処理と繰返し処理 ( 教科書 P.32) プログラムの基本的処理は三つある. (1) 順次処理 : 上から下に順番に処理する ぶんきそろ (2) 分岐処理 : 条件が揃えば, 処理する はんぷく (3) 反復処理 : 条件が揃うまで処理を繰り返す 全てのプログラムは (1) から (3) の

POWER EGG V2.01 ユーザーズマニュアル 汎用申請編

操作方法 XXXTOEMF は コマンドライン形式のアプリケーションです 通常のコマンドと同じように コマンドラインからの実行やバッチファイルに組み込むことが可能です インストールについては, 別紙の KDxxxx コンバートソフトの特記事項について を参照してください ここでは 直接コマンドライン

※ ポイント ※

エクセルの基礎を学びながら、金額を入力すると自動的に計算され、1年分の集計も表示される「おこづかい帳」を作りしょう

作図コマンド : pscoast -R125/148/30/46 -JM15c -B5g5 -Di -W5 -S235 -X6c -Y4c > test.ps 作図例 : 2 分布図の作成 2.1 点を描く 地点の分布を作図するときは たとえば以下のように行います > pscoast -R125/1

JavaプログラミングⅠ

クイックマニュアル(利用者編)

基本的な利用法

やさしくPDFへ文字入力 v.2.0

目次 1. 変換の対象 砂防指定地 XML 作成メニュー シェープファイルからXMLへ変換 砂防指定地 XMLとシェープファイルの対応.csv 変換処理 CSVファイルによる属性指定... 5

メソッドのまとめ

Prog1_3rd

Microsoft PowerPoint - å®�æ−•è©¦é¨fi3ㆮ対ç�Œ.pptx

Microsoft Word - no11.docx

Microsoft PowerPoint - kougi6.ppt

◎phpapi.indd

PowerPoint プレゼンテーション

Prog1_6th

スライド 1

リスト 1 1 <HTML> <HEAD> 3 <META http-equiv="content-type" content="text/html; charset=euc-jp"> 4 <TITLE> 住所の検索 </TITLE> 5 </HEAD> 6 <BODY> <FORM method=

本チュートリアルについて 14 部構成 比較的簡単なトピックから 各回 プログラミング言語 任意 チュートリアルで 新しい内容 宿題 プログラミング演習 次の週 結果について発表 もしくは話し合いをする スライドは Python で Python, C++, Java, Perl についての質問い答

Wordの学習

1 ログインとログアウト 1.1 ログイン ログイン画面で [ password ] 欄にパスワードを入力します (図 1) 図 1 ログイン画面 正しくログインができると Ubuntu のデスクトップ画面 図2 が表示されます 図2 Ubuntu デスクトップ画面 2

PowerPoint プレゼンテーション - 物理学情報処理演習

AppsWF ワークフロー設定ガイド Ver.1.1 株式会社オプロ

Format text with styles

スクールCOBOL2002

<4D F736F F D20837D836A B5F93C192E88C AC888D593FC97CD5F2E646F63>

Microsoft PowerPoint - InfPro_I6.pptx

プログラミングA

これを調べるには pwd というコマンドを使います pwd とは print working directory の頭文 字をとったもので これから意味は明らかですよね 演習 1 (a) pwd を実行した結果を書け なお 立ち上げた直後の作業用ディレクトリのことをホー ムディレクトリ もしくは単に

<4D F736F F D20838D D8D8795AA90CD81698DED8F9C81958EB2816A91808DEC837D836A B5F312E302E302E305F8FAC8B7B2E646F6378>

OS

練習 4 ディレクトリにあるファイルを直接指定する (cat) cat コマンドを使う (% cat ファイル名 ) と ファイルの内容を表示できた ファイル名のところにパス名を使い ディレクトリ名 / ファイル名 のように指定すると ディレクトリ内にあるファイルを直接指定できる 1 % cat _

初めてのプログラミング

Microsoft Word - 18環設演付録0508.doc

Microsoft Word - DF-Salford解説09.doc

目次 本書の概要... 3 QNAP で AD 環境を構築するネットワーク環境... 3 Active Directory ドメインコントローラ構築... 5 AD ユーザ作成 AD ユーザ単独作成 AD ユーザ複数作成 共有フォルダアクセス許可追加

slide5.pptx

ご利用のコンピュータを設定する方法 このラボの作業を行うには 事前設定された dcloud ラボを使用するか 自身のコンピュータをセットアップします 詳細については イベントの事前準備 [ 英語 ] とラボの設定 [ 英語 ] の両方のモジュールを参照してください Python を使用した Spar

図 2 エクスポートによるシェープファイルの新規保存 新規保存するファイルは, より分かりやすい名前をつけて適切なフォルダ (shape フォル ダにまとめておくのがよい ) 上に保存しておく 2 / 10

各種パスワードについて マイナンバー管理票では 3 種のパスワードを使用します (1) 読み取りパスワード Excel 機能の読み取りパスワードです 任意に設定可能です (2) 管理者パスワード マイナンバー管理表 の管理者のパスワードです 管理者パスワード はパスワードの流出を防ぐ目的で この操作

Microsoft PowerPoint - lecture2_PPT.pptx

Transcription:

チュートリアル シェルスクリプトを用いて処理の自動化を行えば 複数コマンドの実行や大量のデータ処理を容易に行うことが可能です 今回はシェルスクリプトに関するチュートリアル ( 全 回シリーズ ) の第 回目として シェルスクリプトの基本や sed と awk に焦点をあてた UNIX コマンドの便利な使い方について近畿大学の和田義孝先生に解説していただきます なお チュートリアル記事は ページ目のみを本誌掲載し 続きは日本計算工学会 HP 上で公開していますので そちらも併せてご参照ください 第 回シェルスクリプトと UNIX コマンドの便利な使い方 和田義孝 自動化やコマンド化できるシェルスクリプト shell OS UNIX Linux Mac OS X Cygwin Linux Windows sed awk シェルの種類 Bourne C shell Bourne shell bash Bourne-Again SHell Windows Cygwin, Mac OS X, Linux OS Windows, 筆者紹介 0 表 シェルの種類 Mac OS X Linux Windows の場合には Cygwin を利用 Windows cmd.exe sed awk Windows Cygwin Cygwin Linux Mac OS X Linux http://www.cygwin.com setup.exe http://cygwin.com/install.html Cygwin Terminal bash Web Vol., No. HP http://www.jsces.org/issue/journal/ Vol., No. 0

チュートリアルシェルスクリプトと UNIX コマンドの便利な使い方 () Mac OS X はターミナルターミナルおよびおよびシェルシェルが含まれている bash, sed,awk はすでにインストールが完了しているので Macintosh HD > アプリケーション > ユーティリティから ターミナル を起動してください 特に何も設定していなければターミナルの起動と同時に bash が起動されておりプロンプト (bash では $) が表示されます Linux は UNIX を真似真似て開発開発された OS ターミナルおよびシェルシェルが含まれている Linux も Mac OS と同様に基本はターミナルで操作する OS なので 例えば Ubuntu や Feodra では gnome-terminal が端末という名称でインストールされています このアプリケーションを起動してください Mac OS X と同様に bash が起動されプロンプトが表示されます 以下ここまでのまとめを記します Windows では Cygwin のインストールが必要 ターミナル ( 端末 ) はキーボード入力や文字情報を出力するためのユーザ インターフェース 起動するとプロンプト ( 入力可能のサイン ) が表示 シェルには幾つかの種類があるがここでは bash について解説 欠かせないかせないパターンマッチング早速ですがコマンドラインで次のように入力して Enter キーをおしてください $ は入力可能を表すプロンプトと呼ばれるサインです 入力しなくてよいです コマンドラインからの入力を表すためにつけるので注意してください $ のあとの空白は最初からあるので $ 以降を正確に空白も含めて入力してください $ mkdir TESTENV $ touch a.txt $ echo * 何が表示されたでしょうか 少なくとも TESTENV と a.txt の つは表示されたと思います 最初のコマンドは TESTENV という名前のフォルダ (UNIX ではディレクトリと呼ぶ ) を作成するコマンドです さらに touch コマンドはファイルが存在しない時は空のファイルを作成します 最後の行はなんでしょうか 今作業しているフォルダにあるファイル名全てを表示したようです 別の言い方をすると シェルにおいて * は作業フォルダにあるファイル名全てを表しています このようにファイル名や文字列をパターンで表現し 削除や追加などの変更を行います これが自動化のポイントになります この入力した文字または 文字 + 文字 が意味を持つものをメタキャラクタと呼びます パターンマッチングに関連するメタキャラクタは * [X]? があります それぞれ 意味はファイル名で 0 文字以上の任意の文字 [] の中の 文字 任意の 文字をそれぞれ表します bash のパターンマッチングを利用するとある程度ファイル名を絞り込むこと ができます $ echo *.txt $ echo [A-Z]* しかし 複雑な処理を行うためにはこれでは不十分です さらに複雑なパターンマッチングを行うための正規表現を紹介します 正規表現とはコンピュータでは様々なものが検索の対象になっていますが その基本は文字列です 正規表現は 特定の文字列を表現するのではなく 特定の条件を満たす文字列を表現するための表記方法 といえます 例えば 拡張子がない文字列だけを表示したり 大文字で始まるファイル名やフォルダ名を表示するといったことも次のようにしてできます 幾つかアルファベット大文字で始まるファイルと拡張子のないファイルを作成して確認してください $ ls egrep '^[^.]+$' $ ls egrep '^[:upper:]' コマンドの解説をします ls は作業フォルダにあるファイルやフォルダの一覧を出力します ls の前についている は本当の ls を呼び出す ( エイリアス設定をキャンセルする ) ためにつけました そして本題です egrep は拡張された正規表現で行単位にマッチングを行うコマンドです シングルクォートの中が正規表現になります [:upper:] でアルファベットの大文字 文字とマッチします 膨大な行数を持つファイルの中からパターンにマッチする文字列があるかどうかを調べることができます また は ls の出力結果を画面に出力せずに egrep コマンドへ渡してくださいというパイプと呼ばれるシェルの機能です UNIX の世界では早くからシェルやコマンドで正規表現が利用されていましたが 表記上の差異が存在します またサポートされている表現 ( メタキャラクタ ) が異なります 現在では POSIX 標準に正規表現も定められていますがやはりコマンドによっては解釈をさせるためのエスケープキャラクタなどを入力する必要があります 本稿ではまずは 書いてある通りに入力してどのように出力結果が変化するのかを見てもらえればよいかと考えています 表 によく使われる正規表現をまとめました 本文を読み進めていく上でこの表を何度も参照して動作をチェックしてみてください さっそく使ってみようってみようまずはコマンドラインでファイルがどのように選択されるかを調べてみましょう そのまえに 重要な約束事を確認します ここをしっかりと行わないとうまく動かなくなります ご注意ください ファイルの作成本稿で示されるシェルプログラムの枠の上に例えば cfile.sh などのように名前が記されています これはプログラムを格納するためのファイル名です 中身は単なるテキストファイルなのでテキストエディタで作成してください 拡張子を.sh としてこのファイルがシェルスクリプトである 計算工学 (-) Vol., No. 0

チュートリアルシェルスクリプトと UNIX コマンドの便利な使い方 () ことを明示するのがよいでしょう シェルは拡張子では実行の可否を判断しないので拡張子がない場合や 違う場合でも実行可能です 表 正規表現で利用される記号 ( メタキャラクタ ) とその表記 表記 ( メタ説明キャラクタ ). 任意の 文字 スペースも含む シェルの? と同じ? 直前の文字の0 回か 回の繰返 + 直前の文字の 回以上の繰返括弧内の任意の 文字 [XXX] 例 [ABC] 大文字 AかBかCのどれか 文字括弧内以外の文字 [^XXX] 例 [^A-Z] 大文字アルファベット以外 ( 数字記号含 ) * 直前の文字の0 回以上の繰返 {n,m} 直前の文字や正規表現のn 回以上 m 回以下の繰返 {n} 直前の文字や正規表現のn 回の繰返 {n,} 直前の文字や正規表現のn 回以上の繰返文字列の先頭または行の先頭 [^XXX] とは違う ^ 例 ^[0-]* 数字から始まる行 ( 文字列 ) 文字列の最後 または行の最後 $ 例 *Z$ Zで終わる行 ( 文字列 ) 正規表現のpattern をグループ化 (pattern) 例 (ab ba)ort abortかbaortと一致正規表現に使われる記号 \ ( メタキャラクタ ) のエスケープ例 \* 文字 * と一致 シェルスクリプトの実行実行方法は 通りあります コマンドラインから実行することには変わりないのですが 次のような 通りがあります シェルスクリプトのファイル名を cfile.sh とします $ sh cfile.sh # sh の代わりに bash 可 または $ chmod +x cfile.sh # 回だけ実行 $./cfile.sh #./ を付ける の 通りです 番目の例では最初の chmod コマンドは一度だけ実行すればよいです シェルスクリプトに実行許可を与えるコマンドです つまり シェルスクリプト自体を新しいコマンドとして実行させたい時に有効な方法です 何度もコマンドを実行するときに有効です 前準備のシェルスクリプトシェルスクリプトの実行以下の cfile.sh のファイルを作成し 実行してください するとつのファイルが作成されます touch コマンドについてはオンラインマニュアル (man touch と入力 ) を参考にしてください touch コマンドで生成されるファイルは空です また data.txt はカンマで区切られたデータを含むファイルになります シェルスクリプトによるによるファイルファイルの選択プログラムを自動化するときによく対象となるのはファイルではないでしょうか ここでは ファイル名を取得して変更することによりその機能や方法を例示します これから説明するために行番号を与えます しかし 入力する際はプログラムのように行番号を入力する必要はありません あくまでも黒枠の中のシ ェルスクリプトだけを入力してください cfile.sh rm -f *.txt for n in sample.txt samplea.txt samplea.txt sampleaa.txt sample_a.txt do touch ${n} cat > data.txt << EOS First Name,Family Name,Initial,ID #,Year JOHN,ABC,-,,0 ROBERT,DEF,-,,000 JOHN,GHI,-,, end EOS プログラム cfile.sh for による処理 :shell0a.sh の解説この簡単なシェルスクリプトは拡張子.txt を持つファイルに対して存在すればそのファイル名を表示します 行目シェルスクリプトをコマンドとして実行する ために必要な記述です chmod コマンドで実行パーミションを与えてコマンドとして利用する場合には必要です シェルは最初の行を読み取りどのプログラムで 行目以降を実行するのかを判断します /bin/sh はシェルのプログラムがファイルシステムのどの場所にあるのかを示しています より知るには UNIX のファイルやディレクトリの指定方法が参考になります 行目シェルで繰返し処理を行うための基本的な構 文を図 に示します name は変数名です 変数の参照は ${name} のように $ とカッコがつきます word は数字 文字列 パターンマッチングなども利用できます このスクリプトでは *.txt となっているのでいま作業しているフォルダにある拡張子が.txt であるすべてのファイルが対象となります 最後に です ここは実行されるコマンドが列挙されます 実際はあまり意識しなくてもよいのですが bash が内蔵しているコマンドなのかそれとも OS にあるコマンドなのかの区別は自ら調べないとわかりません if は bash で呼び出される制御構文の つですちょっと変わっているのが 行目にある fi です 単に if の終わりなので fi となっているということです シェルではリーバースワードと呼ばれ構文の終わりを宣言する特別な意味を持ちます 行目この if 文は変数 ${name} に格納されている文 字列と同じファイル ( フォルダでもよい ) が存在すれば画面に表示 ( 行目の echo) し そうでなければ何もしないという判断をしています -e は条件を表します その他の条件判断の例を表 に示します ところで プログラミング経験のある方は if( )then という構文は納得できる記述かと思います なぜ [ -f ${name} ] のようにカッコがさらについているのかについて説明します 実は [ が bash に内蔵されて 計算工学 (-) Vol., No. 0

チュートリアルシェルスクリプトと UNIX コマンドの便利な使い方 () いるコマンドなのです これは test というコマンドの別表記です なるべく短く読みやすく記述したいために test f ${name} の代わりということです それでは カッコで閉じなくてもよいのではないのかと思うかもしれませんが カッコで記述した場合は対応するカッコで閉じて記述してください 本稿では test ではなくカッコで統一します 行目 echo は変数の内容を出力します 行目 if 文の終わりを宣言します 行目 for 文のループを終えることを宣言します shell0a.sh for name in *.txt ; do if( [ -f ${name} ] ) then echo ${name} fi プログラム shell0a.sh for name in [word... ] ; do 図 bash の for 文 if ; then elif ; then else fi 図 bash の if 文 以上のようにファイルをある程度絞り込んでファイルがあるかどうかを調べる方法を紹介しました 期待通りのりの動作動作をしないをしない例 :shell0a.sh の解説 shell0a.sh などの例で次のように思った方もいたかもしれません いまいるフォルダにあるファイルを表示するのであればファイルがあるかどうかのチェックは不要では? 確かにそのようですが shell0a.sh を入力して実行してください 先ほどと違う点はわざと拡張子 (.txt を.txx) を間違えます そして ファイルの存在チェックを行いません 期待したいのは 何も表示しないという状態です 理由は 存在しないファイルを指定しているからです 出力は図 に示します 残念ながらシェルは *.txx をそのまま出力しました for 文ではパターンマッチングに失敗するとそのままメタキャラクタも含めて出力します これがファイルの存在をチェックする必然性です 条件表記 表 test コマンドの条件表記 説明 -a file file が存在すれば真 -e でも同じ -f file file が存在し通常ファイルであれば真 -d file file が存在しディレクトリ ( フォルダ ) であれば真 -r file file が存在し読み込み可能であれば真 -s file file が存在しサイズが0より大きければ真 -w file file が存在し書き込み可能であれば真 -x file file が存在し実行可能であれば真 str == str 文字列の比較 str とstr が等しければ真 arg -eq arg 数値の比較 arg とarg が等しければ真 arg -ne arg 数値の比較 arg とarg が異なれば真 arg -lt arg 数値の比較 arg がarg より小さければ真数値の比較 arg がarg より小さいか等しければ arg -le arg 真 arg -gt arg 数値の比較 arg がarg より大きければ真数値の比較 arg がarg より大きいか等しければ arg -ge arg 真 shell0a.sh for name in *.txx ; do echo ${name} プログラム shell0a.sh $ sh shell0a.sh *.txx 図 shell0a.sh の実行結果.Excel を使わないわない行と列の編集 ~awk と sed~ sed とその使い方の基本 ~ 行に対するする処理 ~ sed と stream editor とよばれ 行頭から順番に文字や文字列を正規表現によりパターンを記述して置換や変換するためのテキストエディタのつです 普通のエディタは画面に文字列を表示するのが普通ですからちょっと戸惑う方もいるかも知れません しかし 世にあるデータは通常整然と並んでないと使い物になりません 一番わかり易いのが Excel に代表されるような表で表されるデータです 膨大なデータになるといくら Excel を使っても つずつ確認まではしないと思います そこで 効率良く処理するストリームエディタの出番です この sed は様々な処理ができますが 行単位で処理を行うことがポイントになります 早速サンプルを見てみましょう 入力データは図 の内容になりますシェルスクリプト cfile.sh により作られたデータです ファイル名は data.txt です 先頭行はデータのタイトルを表し 各データは, で区切られています また 文字も空白もない ( 改行だけの ) 行が 行目行にあります それでは shell0.sh を実行して sed の働きを確認しましょう そのまま実行する各 sed コマンドの実行がそのまま続けて出力されてしまいます echo で区切り ( ここでは = を 0 文字 ) を表示入れても良いです 記述を短くするために e を新しいコマンドとして定義します そして 解説のために行番号を付けます パイプ と cat コマンドを使うと行番号を出力結果につけることが簡単にできます 図 のプロンプトのよう 計算工学 (-) Vol., No. 0

チュートリアルシェルスクリプトと UNIX コマンドの便利な使い方 () に入力してください First Name,Family Name,Initial,ID #,Year JOHN,ABC,-,,0 ROBERT,DEF,-,,000 JOHN,GHI,-,, end 0 shell0.sh 図 入力データ :data.txt alias e='echo ====================' # eに = 以降の命令を実行させる別名を設定 sed -n ',$p' data.txt ; e # 行から最終行まで表示 sed -n '/^$/,/^end/p' data.txt ; e # 空白行から先頭にendを含む行まで表示 sed ',d' data.txt ; e # 行から 行まで削除 sed '$d' data.txt ; e # 最終行を削除 sed ',/^$/d' data.txt ; e # 行から空白行まで削除 sed 's/john/george/g' data.txt # JOHNをGEORGE に置換 プログラム shell0.sh それでは shell0.sh の解説をいたします 行目他の例と同じです シェルがこのファイルをど のプログラムに実行させるのかを明示して記述します この場合はシェルがシェルを起動することになります 行目文字 e を echo 以下の文字列の別名として設 定します これ以降 e ひと文字は % echo ==================== を実行することになります 入力を減らす便利な機能です 他のシェルにも同様の機能があります 行目 sed のコマンドは必ずシングルクォート ' で囲んでください,$ は行の指定をしています 行目から $( 最終行 ) までという意味です p はストリームを表示するという意味を持ちます つまり 行目以降を表示せよという一部を抜き出す処理をします このとき sed のオプション -n が重要な役割をします 試しに -n を付けずにシェルスクリプトを実行してください 実行結果は から 行目になります 行目 n,m という表記は文字列の出現でも指定でき ます ここでは 正規表現が使われています ^ は行の先頭 $ は行の末尾つまり 文字も空白もない空の行から 先頭に end と文字列がある業までを指定しています 実行結果は から 行目になります 行目 d は削除を意味します ここでは -n は不要で す 実行結果は, 行目になります 行目 sed のメタキャラクタ $ は最終行を表します したがって 最終行以外を表示します 実行結果は から 0 行目になります 行目 行目から空白行まで この例では, 行が 削除されます 実行結果は から 行目になります 0 行目すべての行の JOHN を GEORGE に置換します s の前に行の指定をすれば特定の部分だけ置換対象にな ります 置換の書式は次のとおりです 実行結果は から 行目になります m,ns/pattern/pattern/g m,n は省略可能です pattern を pattern に置き換えます g は行の中にあるすべての pattern を対象とするオプションです g を省略すると行の中にある最初の patten のみが置換されます $ sh shell0.sh cat -n JOHN,ABC,-,,0 ROBERT,DEF,-,,000 JOHN,GHI,-,, end ==================== JOHN,ABC,-,,0 ROBERT,DEF,-,,000 0 JOHN,GHI,-,, end 0... ( 省略 )... ==================== First Name,Family Name,Initial,ID #,Year GEORGE,ABC,-,,0 0 ROBERT,DEF,-,,000 GEORGE,GHI,-,, end 図 shell0.sh のコマンドの入力と実行結果 shell0.sh for name in *.txt ; do echo 'Source full name :' ${name} mn=`echo ${name} sed "s/ ([^.] + ) (.[^.] + )$/ /"` nn=`echo ${name} sed "s/ ([^.] + ) (.[^.] + )$/ /"` echo 'Extracted file name:' ${mn} echo 'Extracted extension:' ${nn} echo プログラム shel0l.sh 次の例では sed を使って拡張子とそれ以外の文字列を分けることを行います 拡張子を変更したり元のファイル名に連番をつけたりすることができるようになるので応用が効くシェルスクリプトと sed の利用法です 注意ですが ファイル名に複数のピリオドがある意図通り動作しません ここではポイントとなる 行目の正規表現を見てみましょう 以下に順を追って説明します sed で文字列の置換を行なう (s/pat/pat/ の形 ) pat は つの正規表現のグループで構成 第一グループ ([^.] + ) ピリオド以外の文字 第二グループ (.[^.] + ) ピリオドに続くピリオド以外の文字 第二グループは行の最後 ($) にある条件を追 計算工学 (-) Vol., No. 0

チュートリアルシェルスクリプトと UNIX コマンドの便利な使い方 () 加 pat は最初のマッチしたグループを参照する でマッチした文字列に置き換え ( 前方参照と呼ぶ ) ^ は否定を表すので [^.] でピリオド以外の文字を表します 文字も記号も含みます それが +(sed では \+ で正規表現であることを明示します これが多少分かりにくい原因 ) を用いてピリオド以外の文字の 回以上の繰返しを表します つまり拡張子を区切るピリオドより前の文字全てにマッチするパターンになります sample.txt sample ([^.] + ) ( ) で前方参照するグループ明示最初のグループなので前方参照.txt (.[^.] + ) ( ) で前方参照するグループ明示 番目のグループなので前方参照 図 プログラム の正規表現 前方参照とは 前にマッチした正規表現を参照することを言います マッチした文字列を再度使いたい場合がよくあります こういった時にはマッチさせる正規表現を ( ) でグループ化し (sed ではエスケープキャラクタを使って \( \) とする ) それらの参照が便利に利用できます グループは つあり拡張子より前の部分と ピリオドを含んだ拡張子の部分の つです 同じ正規表現でパターンマッチングを行いますが 置換部分が 行目で \ と 行目で \ になっているのは図 のように抜き出したい部分が異なるからです 以上の使い方を知っているだけで相当複雑な処理が可能です さて 次にシェルの機能について補足です 行目では 変数 mn に代入しますがバッククォートで囲まれた内部は通常のコマンドが並んでいます これは シェルの内部でシェルを実行し その結果を変数に代入するために用意されたメタキャラクタです この場合は echo と sed の処理の結果を変数 mn に代入せよという意味があります コマンドの出力を変数に代入したい時はこういった書き方が使え 外部のプログラムをどんどん使って良い記述方法が提供されています `...` と同じで別の記述方法は $(commands) です 全く同じ働きをします awk とその使い方の基本 ~ 行と列に対する処理 ~ awk はかなり強力なストリームエディタです sed ができることは大抵できます しかし 記述がより多くなるという欠点があります これまで行なってきたことは機能や範囲を限定することにより簡単な記述ができるように工夫されています awk は他のプログラミング言語と同じように if 文 for 文それから数学関数の sin, cos なども用意されています Excel で計算できる基本的な処理は少ない記述でこなせる能力があります 例題を通して基本的な使い方とその結果を見てみましょう 0 shell0.sh alias e='echo ====================' ##,, 列を表示 awk -F, '$=="JOHN" {print $,$,"("$")"}' data.txt; e ## 列が 00 以上のとき,, 列を表示 awk -F, '$>=00 {print $,$,"("$")"}' data.txt; e ## JOHN がある行数を数え表示 awk -F, '/JOHN/ { sum++ } END{ printf "Num. of JOHNs =%d n",sum }' data.txt; e ## 読み込み行数をつけて,, 列を表示 awk -F, '{print NR,$,$,"("$")"}' data.txt; e ## sed で, 行を削除 列目の平均を計算 sed -n ',p' data.txt awk -F, '{sum+=$; print sum} END{ printf "average=%f n",sum/nr }' プログラム shell0.sh 行目 F, はデータを区切る文字の指定になりま す もし空白やタブを区切りとしたい場合は -F による指定は省略できます 条件 ( 列目が JOHN のとき ) を満足した時に, と 列目を表示します 特に if などの表記は必要ありません 行目 行目の例と同じですが 行目が 00 以上の 時に表示します - 行目出現した文字列がいくつの行にわたってあ るのかを数えます /regexp/ はでは正規表現が利用できます 行目に見慣れない END { } の形が出てきました これは最後に 回だけ処理する内容を記述します 逆に BEGIN { } というのもあります これはデータを読み込む前に 回だけ処理する内容を記述します 数をかぞえる 和を求めるなどの処理には必須の表現です覚えておいてください 行目大文字のの単語には意味があるものがありま す NR は現在処理している行数です ここでは元のファイルの行数を表示しています NF は現在処理している列 (awk ではフィールドと呼ぶ ) 数を表します FS は -F オプションで指定した列の区切り記号です 既定値は空白とタブです - 行目 awk や sed はこのように組み合わせて意味 のある部分だけを表示することも可能です 今回は平均を調べたいので入力行がデータ数と同じに sed で加工し そのあとに awk で和と平均の計算を行いました ファイル名の取得取得と変更最後の例をプログラムに示します 作業しているフォルダにある.txt の拡張子を持つファイルの先頭の文字だけを大文字に変換し 桁の連番を与えたファイル名に変更するシェルスクリプトです 実行結果を図 に示します shell0.sh を見てみましょう 行目シェルスクリプト内部でシェルスクリプトを 実行しています ここでは 余計なエラーメッセージを抑制するためにファイルストリームの指定をして cfile.sh が出力する全てのメッセージを /dev/null に出力して廃棄するよう指定します これは UNIX 流の方法です /dev/null の代わりにファイルを指定すると指定したファイルに書き込まれます 行目 ls は作業しているフォルダのファイル一覧を 出力します 引数に *.txt を与えることにより拡張し 計算工学 (-) Vol., No. 0

チュートリアルシェルスクリプトと UNIX コマンドの便利な使い方 () が.txt のファイルのみを出力します ls の前にある \ は別名でないコマンドの ls を使うことを指示します 行目変数 counter に 0 を代入します この変数がフ ァイルに連番を付けるために使われます 行目 for 文によるループの宣言です 拡張子.txt を 対象とするため *.txt とパターンを記述します 行目シェルは主に文字を対象として動作します 数 値計算を行わせるために let コマンドで数値計算を行いますという宣言をして ++ 演算子で counter に を足します - 行目プログラム の前方参照の例と同じですが 若干異なります 参照されるグループは全部で つあります \ は ファイル名の先頭 文字 \ はファイル名の 文字目以降から最後のピリオド前まで \ はピリオドから拡張子全体を表します sample.txt が対象ファイル名とすると \ が s \ が ample \ が.txt を表すようなパターンです そして \U...\E で囲まれたパターンを大文字にせよという命令になります ここでは \ に対して適用されるので sample.txt は Sample と変換され 変数 bnam に代入されます 0- 行目ピリオドと拡張子が変数 exte に代入され ます 行目分解し変換されたファイル名に連番をつけま す bash には C 言語と同様なフォーマットを受け付ける printf というコマンドがあります これを利用して出力を整えるのが簡単です 結果を変数 nstr に代入します - 行目分解されたファイル名の確認のため画面 に出力します e により区切り記号も表示します 行目 mv コマンドはファイルを移動または名前を変 更するコマンドです mv src dest の形式です この例では ${name} のファイル名を ${nstr} の新しいファイル名に変更します す なお 今回の原稿執筆でも bash, sed, awk, egrep のオンラインマニュアルを何度も参考にしました 使い方は簡単です % man command です スペース キーでページ送り, b キーでページ戻り q で終了です / の後に探したい文字列を入力し ENTER で検索できます 是非 オンラインマニュアルも参考にしてください 次回は ファイルないのデータの並び替えやグラフの大量生成など GUI では操作が困難な場合の処理についてより実践的に解説いたします 0 shell0.sh alias e='echo ====================' sh cfile.sh >/dev/null >& ls *.txt counter=0 for name in *.txt ; do let ++counter bnam=`echo ${name} sed "s/ ([^.] ) ([^.] + ) (.[^.] + )$/ U E /"` exte=`echo ${name} sed "s/ ([^.] + ) (.[^.] + )$/ /"` nstr=`printf "%s_%0d%s" ${bnam} ${counter} ${exte}` echo 'Source file name :' ${name} echo 'Modified file name :' ${nstr} e mv ${name} ${nstr} ls *.txt プログラム shell0.sh まとめ詳細な解説は紙面の都合で出来ませんでしたが まずはここに示した例を元に 理解できる範囲で改変して試してください 試行錯誤し繰り返し試すことが正規表現やシェルスクリプトを理解するためには必要で 計算工学 (-) Vol., No. 0