実装関連事項

各種プログラミング言語の基本的な書き方やソフトウェア等の使用方法について.

ディレクトリの移動

ディレクトリを移動するには cd を使う.移動したい先のディレクトリの名前が現在のディレクトリにあって,その名前が work であった場合,以下のように打つ.

$ cd work

現在のディレクトリはドット . で表されるので,以下のように打っても良い.

$ cd ./work

ひとつ上の階層はドットふたつ .. で表されるので,以下のように打つと上の階層に移動できる.

$ cd ../

cd に加えて,pushd でもディレクトリの移動ができる.

$ pushd work

この pushd コマンドを実行したディレクトリは記憶される.そのため,このコマンドを打った後に,以下のコマンドを打つと,pushd を打ったディレクトリに移動する (戻る) ことができる.

$ popd

ディレクトリの生成

新たにディレクトリを作りたいときは以下のように打つ.このとき,-p を指定しないと,作ろうとしているディレクトリの名前が既存のものと同じであった場合にエラーが出る.

$ mkdir -p work

ファイルのコピーと移動

コピーしたいファイルを foo.txt,コピーした後のファイル名を bar.txt とするとき,以下のようにするとファイルを複製できる.

$ cp foo.txt bar.txt

カレントディレクトリのファイル,foo.pl をカレントディレクトリ直下のディレクトリ ./baz に移動させるとき,以下のようにする.

$ mv foo.pl baz/

また,mv はファイルの名前の変更にも使われる.ファイル foo.pl を新たなファイル名 bar.pl に変更したいとき,以下のようにする.

$ mv foo.pl bar.pl

PATHの通し方

プログラムを起動させる際に PATH を通しておくと便利に使える.本来,プログラムを起動させるには,/ から始まる長いフルパスを指定しなければならないが,特定のディレクトリに PATH を通しておき,そのディレクトリにビルドしたプログラムをインストールすると,そのプログラムはフルパスを指定せずに実行できるようになる.Linux のインストール時に既に PATH が通っているディレクトリも設定されているがそれらは以下のコマンドで確認できる.

$ echo $PATH

これに新たな PATH,$HOME/local/bin を追加で設定するには以下の一文を $HOME/.bashrc に加える.追加場所はどこでも良い.ここで,最後の $PATH は既に通っている PATH を意味する変数.

export PATH=$HOEM/local/bin:$PATH

これで次回ログイン時からは,PATH が通った既存のディレクトに加えて $HOME/local/bin に存在するプログラムに関しては,そのプログラム名を入力するだけでプログラムが起動する.

パイプについて

パイプ | は自身の直前に入力されたコマンドと自身の直後に入力されたコマンドを繋ぐ役割を果たす.パイプを用いると,ディレクトリに存在するファイル数を数えたい場合,コマンド ls でファイルを表示させて,その結果をパイプによって文字カウントのコマンドである wc に渡し,その数を数えるといったような複数のコマンドの実行が必要な操作を1行で入力することができる.

$ ls |wc -l

これを実行すると,カレントディレクトリに存在しているファイルやディレクトリの個数の合計数が表示される.

5

さらに,パイプを便利に用いるためのコマンドに xargs がある.xargs はパイプ以前のコマンドの実行結果を xargs の次に入力したコマンドの引数として設定する.あるファイルを検索しその中身を確認したい場合,コマンド find ファイルを検索した後にパイプを介して head を使った場合は,単に find の検索結果が head にて表示されるだけであるが,xargs head を入力すれば,find によって得られた検索結果のファイルの内容を表示させることができる.

$ find ./ -name "dssp.pl" |xargs head -5

以上のコマンドでは,カレントディレクトリ以下からファイル名が dssp.pl であるファイルを検索し,見つかったファイルの中身を head にて最初から5行目までを表示させる.コマンド xargs を用いると,パイプの直前のコマンドの結果を引数としてパイプの直後のコマンドを実行することができる.

#!/usr/bin/perl
use strict;
use warnings;
 
my @memory=<FILE>

ダウンロード

コンソール上からファイル等をダウンロードしたいときに用いるコマンドとしては wget や curl がある.いくつかの相違があるが,html に記述されているリンクを辿っていく機能は wget に特有なものといえる.一方で,curl は連番ファイルのダウンロードをする際には wget より使いやすい.これらのコマンドを活用すると,インターネット上の情報を短時間に大量収集が可能となる.コマンド wget はダウンロードしたい URL を http://ja.wikipedia.org/wiki/GNU_Wget としたとき,以下のように用いる.

$ wget http://ja.wikipedia.org/wiki/GNU_Wget

ダウンロードしたものの名前を明示的に指定したいときは -O オプションを用いる.ここでの O は大文字アルファベットの O.

$ wget -O wiki_wget http://ja.wikipedia.org/wiki/GNU_Wget

コマンド curl も同様で,以下のように用いる.

$ curl http://ja.wikipedia.org/wiki/CURL

ターミナルへのTabの挿入

ターミナルでの操作中に最も使用するキーのひとつが Tab キーであるが,egrep 等でタブ文字そのものを検索したい場合,普通に Tab キーを押すだけではコマンドの補完機能が発揮されるだけとなる.ターミナル中へ Tab を挿入する方法はいくつかあるが,最も簡単なのは Ctrl キーと V キーを同時押しした後に Tab キーを押す方法.

$ [Ctrl + V]
$ [Tab]

ディスク容量の表示

共用計算機の利用では特にディスク使用量に気を付けるべきである.ディスク使用量は df で表示させることができるが -h オプションを付けると MB や GB 単位で表示されるため見やすい.

$ df -h

ディレクトリサイズの表示

ディレクトリのサイズを確認するときは du コマンドを使う.このとき,-h オプションを用いると G や M のように適切な単位で表示させることができる.ディレクトリ bar のサイズを表示させたいとき,以下のようにする.

$ du -h bar

現在のパスの確認

カレントディレクトリのパスを表示するにはコマンド pwd を使う.pwd とは print name of working directory を意味する.

$ pwd

ファイルの中身を見る

ファイルの参照法はいくつかある.ページごと,行ごとに見たいときには less を使うことが多いが,ファイルの先頭だけを見たいときは head,最下部を見たいときは tail を利用する.その他にも,ページの最初から最後まで一気に表示する cat コマンドもよく使われる.

ファイル hoge.pl の中身を見たいときは以下のようにする.次のページへの移動はスペースを押す.また,/ を押して,文字や数字を入力後エンターを押すと,その行以降の文字・数字列を検索できる.次のヒットを検索するには n を押す.逆に,? を押して文字や数字を入力後エンターを押すとその行以前の文字・数字列を検索できる.

$ less hoge.pl

head はファイルの先頭を表示させるコマンド.デフォルトでは先頭から10行目までが表示されるが,-20 のようにオプションをつけると指定した行まで表示させることができる.

$ head -5 hoge.pl

tail はファイルの最下部を表示させるコマンド.head と同様に -n オプションに引き続き5のようにすることで最下部から5行目までが表示される.また,tail は -f オプションと共に用いると便利である.-f オプションをつけるとリアルタイムでファイルを監視することができる.何らかの処理を実行中に吐き出されるファイルにコマンドを指定すると,最下部に追加される行を見ることができる.

$ tail -n 5 -f hoge.pl

また,cat もよく使う.less では表示させるファイルが長かった場合,エンターを連打しながら少しずつ見る必要があるが,cat なら一気にターミナルウィンドウに表示させることができる.

$ cat hoge.pl

その他に,このコマンドを使うことで複数のファイルの連結 (concatenate) ができる.ファイル foo.txt と bar.txt を連結して baz.txt を生成したいとき,以下のようにする.

$ cat foo.txt bar.txt > baz.txt

ファイルの検索

ファイル検索には find コマンドを用いる.ディレクトリ foo 以下に存在するファイル bar.txt を検索したいとときは以下のようにする.ディストリビューションによっては,検索結果を画面に表示させるために -print を入力しなければならない場合もある.

$ find ./foo -name bar.txt
./foo/baz/qux/bar.txt

正規表現と組み合わせると便利に検索できる.カレントディレクトリ以下において,拡張子が .txt であるファイルをすべて検索したい場合は以下のようにする.

$ find ./ -name "*\.txt"

空のファイル (容量が0のファイル) を検索し,それらを削除するには以下のようにする.

$ find ./ -empty |xargs rm

空のファイルを検索の対象から除外するには以下のように打つ.

$ find ./ -name "\.txt" -not -empty

拡張子が .xml のファイルを検索し,それをディレクトリ bar にコピーさせるには以下のように打つ.

$ find ./ -name "*.xml" |xargs cp -t bar/

オプションに以下のようなものがある.

オプション詳細
-maxdepth n検索する階層の深さを n 階層までに指定.
-type TYPE検索するファイルのタイプを指定.TYPE にはファイル f やディレクトリ d が入る.
-empty空のファイルを検索.

文字列の検索

文字列の検索には egrep を使う.ディレクトリ pdb の中の全ファイルから SPACE GROUP: という文字列を含む行を抜き出したいときは以下のようにする.

$ egrep "SPACE GROUP:" pdb/*

また,egrep を用いると,or 検索が可能になる.or 検索は検索したい文字列の間に | を加える.文字列 foo または bar を含む行をディレクトリ baz 以下の全ファイルから抜き出したいときは以下のようにする.

$ egrep "foo|bar" baz/*

文字列 'foo' および 'bar' を含む行をディレクトリ baz 以下の全ファイルから抜き出したいとき,すなわち and 検索は以下のようにパイプを使うのが便利である.コマンド grep では検索したい文字列にスペースが含まれても,正規表現 \s を用いずに直接スペースキーを入力することで検索できる.

$ egrep foo baz/* |egrep bar

上のように指定したディレクトリの全ファイル中から文字列を検索する際にバイナリファイルにヒットする場合がある.これを避けるには -I オプションを利用する.

$ egrep -I "ncbistdaa" ncbi-blast-2.2.30+-src/c++/*/*/*

特定の文字列が含まれていない行を検索したい場合は,-v オプションを用いる.

$ egrep -v "hoge" fuga.txt

ヒットした文字または文字列を含む行とその1行下の行までを表示させるには以下のように打つ.一方で,-B n とすると,n 行上の行まで表示される.

$ egrep -A 1 "^>" hoge.fa

解凍・圧縮

サイズの大きなファイルをアップロードするとき,移動させるとき,保存するときには,ファイルを圧縮する場合がある.ファイル,foo を bar.tgz という名前で圧縮したいときは以下のようにする.

$ tar zcvf bar.tgz ./foo

ディレクトリの構成や実際のファイルの有無を確認するために,解凍せずに圧縮ファイル hoge.tar.gz の中身を確認したいときは以下のようにする.

$ tar ztf hoge.tar.gz

圧縮ファイル hoge.tar.gz の解凍は以下のようにする.拡張子が .tgz の場合も同様にする.

$ tar zxvf hoge.tar.gz

特定のファイルまたはディレクトリ foo のみを解凍したい場合は以下のようにする..

$ tar zxvf hoge.tgz foo

より圧縮率が高い bzip2 フィルタを利用して圧縮したい場合は以下のコマンドを用いる.

$ tar jcvf foo.tbz ./foo

この場合の解凍は以下のコマンドで行なう.拡張子が tar.gz2 の場合も同様にする.

$ tar jxvf foo.tbz ./foo

gunzip コマンドで圧縮ファイルを解凍する際に,解凍後のファイルの行先を指定したい場合は以下のように -c オプションを用いる.

$ gunzip -c hoge.txt.gz > hoge.txt

bzip2 コマンドを使ってファイル foo.fa を圧縮するには以下のようにする.配列のアライメントファイルはギャップを含む場合が多いが,そのようなファイルに対しては圧縮の効果が高い.

$ bzip2 foo.fa

拡張子 .bz2 のファイルの解凍は以下のように行う.

$ bzip2 -d foo.fa.bz2

文字列の置換

文字列の置換は sed や tr によって行う.例えば,ファイル hoge.txt の中の HOH を SO4 に置換したいときは以下のようにする.

$ sed s/HOH/SO4/ hoge.txt

以上の置換を繰り返し行いたい場合は g を加える.

$ sed s/HOH/SO4/g hoge.txt

また,sed による行の削除も便利である.ファイル hoge.txt 中の modified という文字列を含む行を削除したいとき,以下のようにする.

$ sed '/modified/d' ./hoge.txt

sed 同様,tr も文字列の置換に用いることができる.tr の場合はファイルのリダイレクトが必要となる.ファイル hoge.txt 中の foo という文字列を bar に置換したいとき,以下のようにする.

$ tr foo bar < hoge.txt

tr のとても便利な使い方のひとつにファイル中の小文字のアルファベットを一気に大文字に変換できるというものがある.hoge.txt の小文字を大文字に置換したいとき,以下のようにする.

$ tr a-z A-Z < hoge.txt

また,tr を用いればファイル中の空白文字を改行に置換することもできる.ファイル hoge.txt の空白全てを改行に置換するには以下のようにする.

$ cat hoge.txt |tr " " "\n"

空白文字を削除したいときは以下のように打つ.

$ cat hoge.txt |tr -d " "

ソート

以下のような2カラムからなるファイル,hoge.txt をソートする.

101M	55.6
1EDG	47.7
3NIR	9.73
2ERL	16.18
1WWB	61.39
1ZX5	72.11

sort コマンドを以下のように打つと最初の1カラムを基準にソートされる.また,デフォルトでは並び替えは文字列として行われる.

$ sort hoge.txt

結果は以下のようになる.

101M	55.45
1EDG	47.77
1WWB	61.39
1ZX5	72.11
2ERL	16.18
3NIR	9.73

オプションには以下のようなものがある.

オプション詳細
-k nn で指定したカラムを基準に並び替える.
-n文字列ではなく,数字として並び替える.
-r逆順に並び替える.

これらのオプションを使い,hoge.txt を2番目のカラムを基準に,数字として逆順に並び替えるには以下のコマンドを打つ.

$ sort -k 2 -n -r hoge.txt

これを実行した結果は以下のようになる.

1ZX5	72.11
1WWB	61.39
101M	55.45
1EDG	47.77
2ERL	16.18
3NIR	9.73

指定カラムの抜き出し

テキストファイル等から特定のカラムだけを抜き出したいとき,または文字列等をスプリットしたいときなどは awk コマンドが便利である.以下のようなテキストファイル hoge.txt があるとする.

A	-	1	one
B	-	2	two
C	-	3	three
D	-	4	four
E	-	5	five
F	-	6	six
G	-	7	seven
H	-	8	eight
I	-	9	nine
J	-	1	one

このファイルから数字の書かれているカラムのみを抜き出したいときは以下のようにする.

$ awk '{print $3}' hoge.txt

これを実行した結果は以下のようになる.

1
2
3
4
5
6
7
8
9
1

抜き出せるカラムはひとつだけではない.アルファベットが書かれているカラムと英単語が書かれているカラムを抜き出すには以下のようにする.

$ awk '{print $1,$4}' hoge.txt

これを実行した結果は以下のようになる.

A one
B two
C three
D four
F five
G six
H seven
I eight
J nine
K one

以上では行を空白でスプリットして4本のカラムを作成しているが,スプリットするための区切り文字は自由に変更できる.以上のファイルの2カラム目の - を区切り文字として用い,- 以降の数字および英単語が書かれたカラムを表示させるには以下のようにする.

$ awk -F- '{print $2}' hoge.txt

これを実行した結果は以下のようになる.

	1	one
	2	two
	3	three
	4	four
	5	five
	6	six
	7	seven
	8	eight
	9	nine
	1	one

egrep と併せて用いると,one という単語の入った行の4列目のみを抜き出すといったようなことができる.

$ egrep one hoge.txt |awk '{print $4}'

これを実行した結果は以下のようになる.

one
one

偶数行・奇数行の抽出

テキストファイルから偶数行または奇数行を抜き出したいときは以下のようにする.

$ awk 'NR%2==1' population.txt

偶数行だけ抜き出したいときは以下のようにする.

$ awk 'NR%2==0' population.txt

秘密鍵・公開鍵の生成

秘密鍵と公開鍵の生成には ssh-keygen コマンドを用いる.

$ ssh-keygen -t rsa

上のコマンドの場合 RSA暗号の鍵が $HOME/.ssh 以下に id_rsa と id_rsa.pub の名前で生成される.これらのうち,id_rsa.pub は ssh アクセスしたいサーバーの $HOME/.ssh/authorized_keys に追加書きする.

ファイルの参照パスワードの設定

ウェブ上に公開したディレクトリやファイルへのアクセスに制限をかけるには以下のようにする.まず,以下の内容のファイルに .htaccess と名前を付けて,それをパスワードをかけたいファイルが置いてあるディレクトリに置く.AuthUserFile のところには以下で作成するパスワードを格納するファイル .htpasswd のパスを書く.Require のところには想定されるユーザー名を入れる.この場合,takahashi,yamada,suzukiの3人.AuthName のところに書いた文字はユーザー名およびパスワードの認証画面に表示される文字列である.

AuthType Basic
AuthName "Whati is password?"
AuthUserFile /home/john/.htpasswd
Require user takahashi yamada suzuki

次に,外部からアクセスできない任意のディレクトリ (この場合 /home/john/) に .htpasswd というファイル名のファイルを作成する.中身は空で良い.その後,そのファイルが存在するディレクトリで以下のコマンドを打つ.パスワードの入力を求められるので,そのユーザーに対して設定すべきパスワードを入力する.

$ htpasswd .htpasswd takahashi

以上のコマンドを他のユーザー (この場合,yamadaおよびsuzuki) に対しても実行する.以上で .htaccess を設置したディレクトリ以下のファイルにアクセスする際には設定したユーザー名およびパスワードが必要となる.

文字コードの変換

文字コードを変換したいときはコマンド iconv を用いる.アイコンブと読む.Shift_JIS のテキストファイル foo.txt を UTF-8 に変換したいときは以下のようにする.bar.txt は文字コード変換後のファイル名.

$ iconv -f sjis -t utf8 foo.txt > bar.txt

オプション -f にて変換させるファイルの現在の文字コードを指定する.また,-t にて変換させたい文字コードを指定する.ファイルの文字コードは nkf コマンドで確認できる.以下のように打つ.

$ nkf -g foo.txt

コマンド iconv のオプションには以下のものがある.

オプション詳細
-fインプットファイル (変換したいファイル) の文字コードの指定
-t変換したい文字コードを指定
-lサポートされている文字コードの一覧表示
-c無効な文字を変換しない
-s警告を出させない
--verbose変換の進捗状況を表示

また,nkf を用いても文字コードの変換ができる.テキストファイル foo.txt を UTF-8 に変換したいときは以下のようにする.bar.txt は文字コード変換後のファイル名.

$ nkf -w foo.txt > bar.txt

コマンド nkf のオプションには以下のものがある.

オプション詳細
-e文字コードを EUC に変換
-s文字コードを Shift_JIS に変換
-w文字コードを UTF-8 に変換
-g文字コードを推測する

プロンプトの表記の設定

Bash におけるターミナル上のプロンプトの表記は,PS1 という変数によってコントロールされている.以下のように打つと現在の設定を参照することができる.

$ echo $PS1

表記の方法を変更するためには,~/.bashrcに "PS=表示させたい形式" の一文を追加する.場所はどこでも良い.以下の一文を追加した場合,プロンプトは [ユーザー名@マシン名 カレントディレクトリ ]$ という表記になる.

PS1="[\u@\h \W]\\$ "

シェル関数

Bash で複数個の処理をまとめた新たな関数 func() を定義して,それを使うには以下のようにする.3行目で関数を定義,8行目で定義した関数を呼び出す.

#!/bin/bash

func()
{
	echo -ne "hoge\t"
	echo "hoge"
}

func

上で作成したプログラムを保存して実行すると以下のようになる.

hoge	hoge

関数の中では,ローカル変数を用いるのが便利である.ローカル変数は以下のように local を用いて宣言する.

#!/bin/bash

i=1

func()
{
	local i=9
	echo $i
}

echo $i

func

上で作成したプログラムを保存して実行すると以下のようになる.

1
9

ファイル等の存在確認

Bashでファイル等の存在確認を行いたいときは,[ -e ファイル等 ] の書式を利用して以下のように書く.

#!/bin/bash

if [ -e foo.txt ]
then
echo "OK"
else
cat /dev/null > foo.txt
fi

以上のプログラムを実行すると,ファイル foo.txt がカレントディレクトリに存在する場合,OK と表示され,存在しない場合,空ファイル foo.txt が生成される.

繰り返し処理

Bash で繰り返し処理,特に配列に格納された要素数分だけの繰り返し処理を行うには以下のように書く.

#!/bin/bash

list=(A B C D E)

for((i=0;i<${#list[*]};i++))
{
	echo ${list[$i]}
}

上で作成したプログラムを実行すると以下のようになる.

A
B
C
D
E

グリッドエンジン

UGE や SGE のグリッドエンジンでジョブを投入する際に,特定のマシンにキューが入ってほしくない場合,h=! コマンドを利用する.以下の場合,ホスト名が nt131 のマシンにはジョブが入らない.

$ qsub -l h=!nt131 -soft -l aaa,bbb hoge.sh

特定のキューにジョブが入ってほしくない場合,以下のようにする.

$ qsub -q '!aaa.q' hoge.sh

グリッドエンジンにおいて計算時間を指定するには h_rt を使う.

$ qsub -l h_rt=20:00:00 hoge.sh

アレイジョブの同時実行数制限はオプション -tc を利用する.以下のようにすると全部で100個のアレイジョブが10個ずつ順番に実行される.

$ qsub -t 1-100 -tc 10 hoge.sh

グリッドエンジン関連の主なコマンドは以下.

オプション詳細
qsubジョブの投入.
qstatジョブの実行状況等の確認.
qdel JobIDJobID のジョブを削除.
qhold JobIDJobID のジョブをホールド.
qrls JobID上でホールドしたジョブのホールド解除.
qmod -s JobID実行中のジョブ JobID を一時停止.
qmod -us JobID上の一時停止を解除.
Hatena Google+