計算物理学II (第３回)

今回の内容• テキストエディタ(emacs)の使い⽅• テキスト処理に関連するコマンドの演習(grep,sed,awkなど)• リダイレクト・パイプライン• ファイルの転送• ファイル、ディレクトリの圧縮・解凍テキスト処理の例

今回の⽬標はこのようなテキストから必要な情報だけを抜き出すことができるようになることemacsの使い⽅emacsの起動
テキスト編集はemacs(イーマックス)というエディタで⾏う。
TeXソースファイルやプログラムを書くのに使いますので基本的な使い⽅を覚えてください。
起動はemacsというコマンドで起動-nwオプション(no windows)をつけない場合は環境・設定によってはemacs⽤の別ウインドウが開く(ネットワーク速度が遅いと重くて使い物にならないため同じウインドウで開く)
emacsの後に開きたいファイル名を指定。ファイルが存在しない場合は新規作成となるウィンドウ全体がemacsの⼊⼒画⾯となる(起動中はシェルは表⽰されなくなり使えない)emacsの使い⽅・ファイルの保存
テキストを⼊⼒できる後の演習で使うので左のような数字と英単語(何でもよい)を20⾏ほど適当に⼊⼒。
ファイルの保存は C-x C-s(Ctrlキーを押しながらxを押した後Ctrlを押しながらsを押す、２つの動作の間Ctrlは押しっぱなしでOK)
⼊⼒中は頻繁にC-x C-sを押して随時保存をする。
保存されると下部のメッセージ欄に”Wrote ファイルの絶対パス” が表⽰

emacsの終了は C-x C-c 。シェルに制御が戻る。
保存せず終了しようとすると保存するかを下部で聞かれるのでyesかnoを⼊⼒

emacsの使い⽅• C-x C-f: 新しいファイルを開く (下のメッセージ欄でパスを指定)• C-s ファイル内を検索(下向き), C-r ファイル内を検索(上向き)(メッセージにI-search: と出るので続けて検索したい⽂字列を⼊⼒)
次の検索候補に移動するときはC-sまたはC-rを何度も⼊⼒• C-g コマンドのキャンセル(emacs使⽤中に⼊⼒できなかったりしたときに使うとよい)以下はシェルのコマンド⼊⼒の時と同じ• C-a でカーソルを⾏の先頭に移動 C-e でカーソルを⾏の最後に移動• C-k でカーソルのある⾏のカーソルより右側を削除(カット)• C-u でカーソルのある⾏のカーソルより左側を削除(カット)• C-y 貼り付け。C-kまたはC-uで削除されたものを貼り付ける(ヤンク)• カーソルの移動: C-p (上) C-n (下) C-b (左) C-f (右)emacsの使い⽅• M-%: (Metaキー(Esc)を押して離した後% (shift + 5)を押す)
⽂字列の置換。メッセージ欄にQuery replace: と出るので• 置換する⽂字列を⼊⼒してEnter• 置換後の⽂字列を⼊⼒してEnter• ファイルを上から検索するので置換したい場合はy, しない場合はnをそれぞれ⼊⼒• C-l: カーソルのある⾏が中央に来るように表⽰領域を移動emacsのバックアップファイル• emacsでファイル(test.txt)を編集して保存すると保存前のファイルが test.txt~ という名前でディレクトリに残る。元に戻したいときはmvコマンドを使って戻すことができる。
• ⼀個前のバージョンしか保存されない。
⼀⾏追加して保存してみる
test.txt~に保存前のデータが保存される

diffコマンドで差分を⾒る
1⾏⽬だけが異なる(diffコマンドは２つのファイルの差分を表⽰)

発展課題• emacsよりも⾼速に動作するテキストエディタとしてvi (またはvim)がある。使⽤⽅法が少し特徴的なので使い⽅を調べてみよう。ファイルの⼀部分だけの修正などで便利。
• 最近はVisual Studio Codeというコードエディタが主流になりつつある。このエディタではsshの設定を適切に⾏うことによりリモートのファイルの編集が可能。⾃分のコンピュータにVSCodeをインストールし、サーバ上のファイルを直接操作してみよう。

テキスト処理に関するコマンド

ファイルの⼀部だけを表⽰
emacsで作ったファイルを使っていくつかのコマンドの演習を⾏う。
head ‒n ⾏数 ファイル名：ファイルの上から指定⾏だけを表⽰
tail ‒n ⾏数 ファイル名：ファイルの下から指定⾏だけを表⽰
⻑いファイルの⼀部だけを⾒たい場合に便利。

⾏数を指定しない場合は10⾏表⽰-nオプションなしで下から10⾏を表⽰

下から5⾏だけ表⽰
上から2⾏を表⽰

ファイルの⾏数・単語数を表⽰(wc)wc ファイル名

test.txtファイルは20⾏、41単語、247バイトであることが表⽰される (word count)並び替え(sort)
sort ファイル名

先頭の⽂字順に並び替え

sort ‒n ファイル名-nオプションで数値順で並び替え(もともとと同じ並び)

並び替え(sort)
sort ‒r ファイル名

⽂字列としてソートした後逆順に並び替えて出⼒sort ‒nr ファイル名 (-n ‒rや ‒rnもOK)数値でソートして逆順に並び替えて出⼒並び替え(sort)
sort -k 列数 ファイル名

2列⽬の値で並び替えて出⼒。⼤⽂字のMが先頭に来て⼩⽂字のaから順に並んでいる。⽂字列検索(grep)
grep ⽂字列 ファイル名 でファイルの中から⽂字列を含む⾏のみを出⼒(global regular expression print、グレップ)
test.txtで”cs”を含む⾏のみを出⼒オプション-n ⾏番号をつける-v ⽂字列を含まない⾏だけを出⼒-i ⽂字列の⼤⽂字と⼩⽂字を区別しない
grepでは正規表現(regular expression)を使うことができる。正規表現の詳細は省略するが⾊々な⽂字列を⼀つの⽂字列で表現できる。grep 正規表現 などで検索すると多くの情報を⾒つけることができる。

⽂字列の置換(sed)sedとは：Stream Editor。読み込んだファイルに対して処理を⾏い、結果を標準出⼒に出⼒する。(結果をファイルに保存したい場合はリダイレクトを使う)
⽂字列の置換sed ʻs/置換前⽂字列/置換後⽂字列/gʻ ファイル名

mechanicsだったところがtheoryに置換されている
gフラグがない場合は⼀⾏に複数のmechanicsが含まれている場合はじめの⼀つだけ置換してその⾏の処理は終了する。
⼀⾏にあるすべてのmechanicsを置換する場合はgフラグをつける。

⾏の削除(sed)
特定の⾏を削除：sed ʻ⾏番号dʼ ファイル名
⾏1から⾏2までを削除：sed ʻ⾏番号1、⾏番号2dʼ ファイル名
⽂字列を含む⾏を削除：sed ʻ/⽂字列/dʼ ファイル名

2-4⾏⽬を削除
3⾏⽬を削除⽂字列icsを含む⾏を削除
最終⾏は$でも表すことができる
2⾏⽬から最終⾏までを削除

⾏の挿⼊(sed)
ある⾏の直前に⽂字列を挿⼊：sed ʻ⾏番号i ⽂字列ʼ ファイル名
ある⾏の直後に⽂字列を挿⼊：sed ʻ⾏番号a ⽂字列ʼ ファイル名

2⾏⽬(2 mathematics)の直前にbiologyの⽂字列からなる⾏を挿⼊

2⾏⽬(2 mathematics)の直後にbiologyの⽂字列からなる⾏を挿⼊

⾏の上書き(sed)
ある⾏を⽂字列で上書き：sed ʻ⾏番号c ⽂字列ʼ ファイル名

2⾏⽬(2 mathematics)をʼ2 biologyʼ⽂字列で上書き

列の取り出し(awk)• awk(オーク)とは：テキスト処理を⾏うプログラミング⾔語。
• ファイルを読み込み1⾏ずつ処理が⾏われる• 書式はawk パターン ʻ{アクション}ʼ ファイル名• よく使うのは列の取り出し。複雑な処理も可能だがPythonなど他の⾔語を使うことが多い。

2列⽬を出⼒

2列⽬、1列⽬の順に出⼒
レコードは”,” で区切る
1列⽬、2列⽬、1列⽬の順に出⼒その他のテキスト処理のコマンド• diff: ２つのファイルの差分を表⽰する• uniq: 重複⾏を削除• cut: ⼀部の列だけを取り出す

リダイレクト・パイプライン

リダイレクト(標準出⼒)• コマンド実⾏の基本的な動作：• コマンドを⼊⼒する→端末の画⾯の次の⾏に結果が出⼒される• コマンドの出⼒は標準出⼒(stdout; standard output)に出⼒されるようになっている。
• シェルで標準出⼒=画⾯への出⼒という設定になっている• 標準出⼒のリダイレクト• 標準出⼒を画⾯ではなく指定したファイルに出⼒• 書き⽅ コマンド > 出⼒ファイル

headコマンドを実⾏すると画⾯(標準出⼒)に結果が出⼒される
出⼒結果を head.txtにリダイレクト
画⾯上には何も表⽰されない

head.txtファイルの中⾝をcatで確認すると head ‒n 2 test.txtの結果が保存されている

リダイレクト(標準出⼒)
標準出⼒のリダイレクトをすでに存在するファイルに対して⾏うと上書きされる。
上書きではなく追記をしたい場合は >> を使う

head.txtファイルを作る

すでに存在するファイルに対してリダイレクトすると上書きされる

追記するには>の代わりに >> を使う
tailの実⾏結果の下にheadの実⾏結果が追記される

リダイレクト(標準エラー出⼒)• コマンドを実⾏すると画⾯にエラーメッセージが出⼒されることがある。
• コマンドのエラーメッセージは標準エラー出⼒(stderr; standard error)に出⼒されるようになっている。
• シェルでは標準エラー出⼒＝画⾯への出⼒に設定されている• 標準エラー出⼒をファイルへリダイレクトするには 2> を使う
存在しないコマンドを実⾏するとエラーメッセージが出⼒される
標準出⼒をリダイレクトしてもエラーメッセージは画⾯に出⼒されerrorファイルには何も書かれていない
標準エラー出⼒をリダイレクトすると画⾯には何も出⼒されなくなり、errorファイルにエラーメッセージが書き込まれるリダイレクト(標準⼊⼒)• コマンドの中には標準⼊⼒(stdin; standard input)から値を受け取って結果を表⽰するものがある。
• シェルで標準⼊⼒＝キーボードからの⼊⼒となっている• 標準⼊⼒をファイルにリダイレクトするには コマンド < ファイル名 とする
catコマンド：標準⼊⼒(キーボードからの⼊⼒)からの⼊⼒を標準出⼒(画⾯)に表⽰する
終了するにはC-d (または強制終了のC-c)
ファイルを指定せずに実⾏

C-dで終了キーボードで123と打ってEnter(標準⼊⼒)
画⾯上に123が表⽰される(標準出⼒)キーボードで456と打ってEnter(標準⼊⼒)
画⾯上に456が表⽰される(標準出⼒)
標準⼊⼒をファイルにリダイレクト

ファイルの中⾝が標準出⼒に表⽰される
例えば cat < head.txt > head.out とすると head.txtの内容をhead.outに出⼒となる。

リダイレクトの応⽤
標準⼊⼒をinputファイルから読み込み標準出⼒をoutputファイルに書き出し、標準エラー出⼒をerrorファイルに書き出したい場合
コマンド < input > output 2> error
標準出⼒と標準エラー出⼒両⽅をoutputファイルに書き出す場合
コマンド > output 2>1&

標準出⼒をどこにも出⼒したくない場合(出⼒が⼤量で不要な場合など)
コマンド > /dev/null/dev/nullファイルに書き込まれた内容はすべて破棄される。(nullデバイス)

パイプライン• コマンドの出⼒結果(標準出⼒)を他のコマンドの標準⼊⼒に渡す• コマンド1 | コマンド2 とするとコマンド1の標準出⼒がコマンド2の標準⼊⼒に渡される (縦棒は右上のBackspaceの隣のキーをshiftキーと⼀緒に押す)
test.txtファイルの先頭から5⾏を標準出⼒(画⾯)に表⽰

アルファベット順に並び替わる

先頭から5⾏をsortコマンドの標準⼊⼒にわたす
sortコマンドでは2列⽬で並び替えを⾏った結果を標準出⼒(画⾯)に表⽰

sortコマンドの出⼒をheadコマンドに渡し、先頭に1⾏だけを標準出⼒に
表⽰

パイプラインの応⽤• 出⼒が⻑いコマンドの表⽰
historyコマンド。何百⾏も表⽰される。 history | less とすることで先頭から順番に表⽰することができる

ファイルの転送

⾃分のコンピュータ↔SSHサーバ間のファイルの転送(移動)• WindowsでWinSCPを使っている場合• ドラッグ＆ドロップでファイルを移動すればコピーが転送される• 転送元のファイルは削除されない

左側がローカル(いま操作しているコンピュータ)

右側がサーバ(Linuxサーバ上のファイル)⾃分のコンピュータからSSHサーバへのファイルのコピーを転送• WindowsのWSLでLinuxを動かしている、またはMacの場合• scpコマンドで他のコンピュータにファイルのコピーを転送する• 以下は⾃分のコンピュータのtestdirディレクトリにあるreport.txtをLinux側に転送する例• scp コピー元のファイルのパス

コピー先のファイルのパス

physicslinux1のホームディレクトリに転送する場合

compphys2に転送する場合
scpコマンドはphysicslinux1-2ではなく⾃分のコンピュータで実⾏する(physicslinux1-2側から皆さんのコンピュータにはアクセスできない)
今ログインしている⾃分のコンピュータからphysicslinux1にreport.txtファイルを転送する
ログインしているコンピュータ上ではないパスは ユーザ名＠ホスト名：パス で指定する
パスを省略すればホームディレクトリになる。
:の後に compphys2あるいは compphys2/ とするとホームディレクトリにある compphys2ディレクトリの中となる
SSHログインと同じパスワードを聞かれるので⼊⼒すると転送が始まる。

SSHサーバから⾃分のコンピュータへのファイルの転送• WindowsのWSLでLinuxを動かしている、またはMacの場合• scpコマンドで他のコンピュータからファイルのコピーを転送する• 以下はphysicslinux1のcompphys2/report.txtファイルを⾃分のコンピュータに転送する例• scp コピー元のファイルのパス

コピー先のファイルのパス⾃分のコンピュータでのカレントディレクトリに転送する場合

scpコマンドはphysicslinux1-2ではなく⾃分のコンピュータで実⾏する

ここにスペースが必要

上の例ではコピー元は physicslinux1のホームディレクトリにあるcompphys2の中のreport.txtファイル, コピー先は⾃分のコンピュータのカレントディレクトリ (testdir)(“.”はカレントディレクトリを表す)

scpコマンドのその他の使い⽅• ディレクトリの転送はオプション ‒r をつける

ファイルではないため転送に失敗
ディレクトリと中のファイルがすべて転送されるsftp (SSH File Transfer Protocol)• sftp ユーザ名＠SSHサーバ名

でパスワードを⼊⼒して接続。

• ls, cd, pwdのコマンドを使ってサーバのディレクトリを移動• lls, lcd, lpwdコマンドでローカルのディレクトリの移動• リモート→ローカルの転送はget, ローカル→リモートの転送はput で⾏う
サーバのディレクトリのファイル⼀覧を⾒る

ローカルのディレクトリのファイル⼀覧を⾒る
サーバのreport.txtファイルをローカルコンピュータにダウンロード

ローカルコンピュータのreport.txtファイルをサーバにアップロード
exitで終了

rsync (ファイル同期)• scp, sftpは転送速度が遅い• 圧縮して転送が可能：⼤量のファイルを転送したい場合• 差分を転送：更新⽇時の新しい変更があったファイルだけ転送(バックアップに便利)• rsync ‒avz ‒e ssh 転送元のパス

転送先のパス

初回はすべてのファイルが転送される
この後サーバ側でreport.txtだけ修正した場合変更のあるファイルだけ実際に転送されるscp/rsyncの設定(発展演習)• scp/rsyncで転送するときに毎回パスワードを⼊⼒するのが⾯倒• 公開鍵⽅式を使ってssh-agentに鍵情報を登録しておくとパスワード⼊⼒を省略できる→次の発展演習• scp/rsyncで転送するときにユーザ名@physicslinux1.u.tsukuba.ac.jpと毎回⼊⼒するのが⾯倒• sshの設定ファイル .ssh/config で設定すれば短い⽂字列に置き換えることができる。
(https://www.u.tsukuba.ac.jp/publickey/の最下部に設定例がある)

公開鍵認証⽅式(発展演習)• 公開鍵認証⽅式の設定を⾏うと• VPN接続が不要になる。
• ssh-agentの設定によりscpなどで毎回のパスフレーズ⼊⼒を省略できる。
• 設定⽅法は全学計算機システムのページ参照

https://www.u.tsukuba.ac.jp/publickey/

設定内容• 公開鍵、秘密鍵のペアを作成(秘密鍵には必ずパスフレーズを設定)• 公開鍵を(VPNで接続して)サーバに転送し、所定の位置に配置(秘密鍵はサーバに置かない)• (VPN接続を切断して)秘密鍵＋パスフレーズを⽤いてサーバに公開鍵認証⽅式でログイン• さらにssh-agent (PuTTYではpageant)に秘密鍵を登録するとパスフレーズ⼊⼒を省略できる

URLからファイルをダウンロードする(wget)
wget インターネットアドレス(URL)： 指定したURLのファイルをダウンロードする

授業のホームページからx2.txtをダウンロード

保存完了

カレントディレクトリに保存される

ファイル・ディレクトリの圧縮・解凍ディレクトリの圧縮
Windowsではzipがよく使われるがLinuxでは.tgz(または.tar.gz)がディレクトリの圧縮形式としてよく使われる。
.tarはディレクトリを⼀つのファイルにアーカイブした拡張⼦、.gzはgzipで圧縮した拡張⼦。
これらを合わせて .tar.gzまたは.tgzという拡張⼦が⽤いられる。
tarコマンドによる圧縮： tar czvf 作成する圧縮ファイル名 圧縮するディレクトリ
オプションczvfの順番は何でも良い c: 圧縮ファイルを作成 z: gzip圧縮 v: 結果を画⾯に表⽰ f:ファイルに圧縮vはなくてもよい。zがないと圧縮されない(tarアーカイブ)。
圧縮せずに⼀つのファイルにまとめるだけの場合は.tarという拡張⼦を使う
ディレクトリの圧縮はディレクトリの外に出てから⾏う
compphys2ディレクトリをcompphys2.tgzファイルに圧縮

ディレクトリの解凍• tarコマンドによる解凍： tar zxvf 圧縮ファイル• x:解凍のオプション

compphys2.tgzをこのディレクトリに解凍解凍したディレクトリが現れる
この他にbz2圧縮形式による .tar.bz2 (tbz)という拡張⼦もLinuxでは⽤いられる。
zの代わりにjオプションを⽤いる

演習
historyコマンドであなたが端末にこれまで(の⼀定期間)に⼊⼒したコマンドの⼀覧が出⼒されます。これまでに何回 ls コマンドを⼊⼒しましたか。
(grep, パイプライン, wcを使ってみましょう)
wコマンドで今現在ホストにログインしているユーザのリストが表⽰できます(個⼈情報なのでSNS等で公開しないように)今何⼈ログインしていますか？
(パイプライン、wcを使ってみましょう)
CPUの負荷 (1.0で100%)

ユーザ名(の⼀部)

ログイン元IPアドレス ログイン時間

今実⾏しているコマンド

⼀瞬で実⾏が終わるコマンドは表⽰されない

演習
次のファイルx2.txtをhttps://wwwnucl.ph.tsukuba.ac.jp/~hinohara/compphys2-20/doc/x2.txtからダウンロードして表⽰してみましょう。(wgetコマンドでダウンロード)
y=x2を計算したものですが、数字以外の情報が多くて扱いにくいです。
このファイルから数字以外の⽂字列をすべて消してx2data.txtとして保存してみましょう。

パイプライン、grep、 sed、awkなどを使ってみましょう。(⼀⾏のコマンドで可能です)