計算物理学II (第３回)前回授業に関するコメント• Ubuntuで⽇本語⼊⼒ができない
https://www.u.tsukuba.ac.jp/faq/#linux• manabaの問題4 について
• 講義資料
スマホで⾒ている⼈もいましたが⼤きなモニタもあるのでLinuxでpdfを表⽰してみては今回の内容• テキストエディタ(emacs)の使い⽅• テキスト処理に関連するコマンドの演習(grep,sed,awkなど)• リダイレクト・パイプライン• ファイル、ディレクトリの圧縮・解凍テキスト処理の例

今回の⽬標はこのようなテキストの作成・テキストファイルから必要な情報だけを抜き出すことができるようになることemacsの使い⽅emacsの起動
テキスト編集はemacs(イーマックス)というエディタで⾏う。
TeXソースファイルやプログラムを書くのに使いますので基本的な使い⽅を覚えてください。
・起動はemacs &というコマンドで起動。別ウインドウで起動する。
・ &をつけない場合はemacsが起動中(実⾏中)は端末が使えない。
(コマンドのあとに&をつけるとバックグラウンドでコマンドが実⾏できる)
emacsの後に開きたいファイル名を指定できる。ファイルが存在しない場合は新規作成となる
例えば test.txtというファイルを作成して編集したい場合はemacs test.txt &-nwオプション(no windows)をつけると端末内でemacsが起動(ssh接続の場合はネットワーク速度が遅いと別ウインドウは重くて使い物にならないため-nwをつけるほうがよい)

ウィンドウ全体がemacsの⼊⼒画⾯となる(起動中はシェルは表⽰されなくなり使えない)emacsの使い⽅・ファイルの保存
キーボードを使ってテキストを⼊⼒できる後の演習で使うので左のような数字と英単語(何でもよい)を10⾏ほど適当に⼊⼒。
ファイルの保存は C-x C-s(Ctrlキーを押しながらxキーを押し、xキーを離し、Ctrlを押しながらsを押して、sキーを話す
２つの動作の間Ctrlは押しっぱなしでOK)
⼊⼒中は頻繁にC-x C-sを押して随時保存をする。
保存されると下部のメッセージ欄に”Wrote ファイルの絶対パス” が表⽰
開いているファイル名

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

最低限必要なemacsの使い⽅• 起動• シェルで emacs ファイル名 & (または emacs ファイル名 -nw)
• ファイル名を指定せず emacs & (-nw) だけで起動し、C-x C-fで開くファイルを選んでもよい(新規ファイル・既存ファイル)• 編集• キーボードで英数字⼊⼒• ⽇本語⼊⼒。今使っているコンピュータの⽇本語⼊⼒が使えるはず。
• Linux側の⽇本語⼊⼒を使う場合は C-\で切り替え• 保存• C-x C-s (Ctrlキーを押しながらx、sを順番に押す)• 終了• C-x C-c (保存しないで終了しようとすると保存するか聞かれる)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コマンドは２つのファイルの差分を表⽰)
diff ファイル1 ファイル2

その他のテキストエディタ• emacsよりも⾼速に動作するテキストエディタとしてvi(ヴィーアイ)、またはvim(ヴィム)がある。使い⽅が少し特徴的。
ファイルの⼀部分だけの修正などで便利。
• 最近はVisual Studio Codeという多機能なコードエディタがプログラムを書くのに主流になりつつある。このエディタではsshの設定を⾏うことによりリモートのファイルの編集も可能。
• sshでリモートのコンピュータにあるファイルの(⼩規模な)編集
ではemacsまたはviが主流。

テキスト処理に関するコマンド• head, tail: ファイルの先頭、末尾の指定⾏だけ表⽰• wc: ファイルの⽂字数、⾏数などの情報を表⽰• sort: 指定列で並び替え• grep: ファイルの内容検索• sed: ⾏ごとにファイルの内容変換など• awk: ⾏ごとにファイルの内容の⼀部表⽰など• diff: ２つのファイルの差分を表⽰する• uniq: 重複⾏を削除• cut: ⼀部の列だけを取り出す

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

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

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

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

test.txtファイルは21⾏、43単語、254バイトであることが表⽰される (word count)

ちなみにこのディレクトリにtest.txtファイルしかない場合はタブ補完が使えます。
wcとスペースを⼊⼒後タブキーで⾃動的にtest.txtが補完されます。(他のコマンドの場合も)

並び替え(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⾏⽬(1 physics)の直前にbiologyの⽂字列からなる⾏を挿⼊

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

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

2⾏⽬(1 physics)をʼ1 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)
ファイルを指定せずに実⾏
キーボードで123と打ってEnter(標準⼊⼒)
画⾯上に123が表⽰される(標準出⼒)キーボードで456と打ってEnter(標準⼊⼒)
画⾯上に456が表⽰される(標準出⼒)
C-dで終了標準⼊⼒をファイルにリダイレクト

ファイルの中⾝が標準出⼒に表⽰される
例えば 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⾏を標準出⼒(画⾯)に表⽰

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

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

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

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

複数のコマンドを順に適⽤して処理ができるのでプログラムを書かなくても簡単な処理が可能

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という拡張⼦を使う
ディレクトリの圧縮はディレクトリの外から⾏う

3rdディレクトリを3rd.tgzファイルに圧縮

ディレクトリの解凍• tarコマンドによる解凍： tar zxvf 圧縮ファイル• x:解凍のオプション
すでに3rdというディレクトリがあるので名前を変えておく
3rd.tgzをこのディレクトリに解凍解凍したディレクトリが現れる
この他にbz2圧縮形式による .tar.bz2 (tbz)という拡張⼦もLinuxでは⽤いられる。
zの代わりにjオプションを⽤いる

第３回課題・manabaから提出(提出任意・成績には反映しません)
1. historyコマンドであなたが端末にこれまで(の⼀定期間)に⼊⼒したコマンドの⼀覧が出⼒されます。これまでにlsコマンドを⼊⼒した回数のみを標準出⼒に出すにはどのようなコマンドを⼊⼒すればよいですか？
(grep, パイプライン, wc, awkなどを使うと1⾏で書けます)。
これまでに何回lsを⼊⼒していましたか？
(タイプミスも含めてlsを含むコマンドを打った場合、でOK)

第３回課題
2. 次のファイルx2.txtをhttps://wwwnucl.ph.tsukuba.ac.jp/~hinohara/compphys2-23/doc/x2.txtからダウンロードして表⽰してみましょう。(wgetコマンドでダウンロード)
y=x2を計算したものですが、数字以外の情報が多くて扱いにくいです。
x2.txtから右のような数字のみ取り出したx2data.txtファイルを作成するにはリダイレクト、パイプライン、grep、 sed、awkなどを使って(⼀⾏のコマンドで)どのように書けますか。