計算物理学II (第３回)
•テキストエディタ(emacs)の使い方•テキスト処理に関連するコマンドの演習(grep,sed,awkなど) •リダイレクト・パイプライン•ファイル、ディレクトリの圧縮・解凍
[hinohara.nobuo.ga@icho:~/compphys2/3rd$ cat x2.txt calculate y = xxx2 x =    0.0 y =    0.0 calculate y = xxx2 x =    1.0 y =    1.0 calculate y = xxx2 x =    2.0 y =    4.0 calculate y = xxx2 x =    3.0 y =    9.0 calculate y = x**2 x =    4.0 y =   16.0 calculate y = xxx2 x =    5.0 y =   25.0 calculate y = xxx2 x =    6.0 y =   36.0 calculate y = x**2 x =    7.0 y =   49.0 calculate y = x**2 x =    8.0 y =   64.0 calculate y = xxx2 x =    9.0 y =   81.0 calculate y = xxx2 x =   10.0 y =  100.0 [hinohara.nobuo.ga@icho:~/compphys2/3rd$ cat x2data.txt 0.0 0.0 1.0 1.0 2.0 4.0 3.0 9.0 4.0 16.0 5.0 25.0 6.0 36.0 7.0 49.0 8.0 64.0 9,0 81,0 10.0 100.0今回の目標はこのようなテキストの作成・テキストファイルから必要な情報だけを抜き出すことができるようになることemacsの使い方
テキスト編集はemacs(イーマックス)というエディタで行う。 TeXソースファイルやプログラムを書くのに使いますので基本的な使い方を覚えてください。 ・起動はemacs &というコマンドで起動。別ウインドウで起動する。 ・ &をつけない場合はemacsが起動中(実行中)は端末が使えない。 (コマンドのあとに&をつけるとバックグラウンドでコマンドが実行できる) emacsの後に開きたいファイル名を指定できる。ファイルが存在しない場合は新規作成となる例えばtest.txtというファイルを作成して編集したい場合はemacs test.txt & -nwオプション(no windows)をつけると端末内でemacsが起動(ssh接続の場合はネットワーク速度が遅いと別ウインドウは重くて使い物にならないため-nwをつけるほうがよい) hinohara.nobuo.ga@icho:~/compphys2/3rd$ emacs -nw test.txtウィンドウ全体がemacsの入力画面となる(起動中はシェルは表示されなくなり使えない)
File Edit Options Buffers Tools Text 2 mathematics ! equation
キーボードを使ってテキストを入力できる後の演習で使うので左のような数字と英単語(何でもよい)を20行ほど適当に入力。ファイルの保存はC-x C-s (Ctrlキーを押しながらxキーを押し、xキーを離し、 Ctrlを押しながらsを押して、sキーを話す2つの動作の間Ctrlは押しっぱなしでOK)入力中は頻繁にC-x C-sを押して随時保存をする。保存されると下部のメッセージ欄に”Wroteファイルの絶対パス”が表示開いているファイル名-UU-:----F1 Bot L21    (Text) test.txt Wrote /home/hinohara.nobuo.ga/compphys2/3rd/test.txt emacsの終了はC-x C-c 。シェルに制御が戻る。保存せず終了しようとすると保存するかを下部で聞かれるのでy (yes)かn (no)を入力——・水水—F1 test.: Save file /home/hinohara.nobuo.ga/compphys2/3rd/test.txt? (y, n, !, ., g, C-r, d

•起動
•シェルで emacsファイル名& (またはemacsファイル名 -nw) •ファイル名を指定せずemacs & (-nw)だけで起動し、C-x C-fで開くファイルを選んでもよい(新規ファイル・既存ファイル) •編集•キーボードで英数字入力•日本語入力。今使っているコンピュータの日本語入力が使えるはず。 • Linux側の日本語入力を使う場合はC-¥で切り替え•保存・C-x C-s (Ctrlキーを押しながらx、sを順番に押す) •終了• C-x C-c (保存しないで終了しようとすると保存するか聞かれる)
• 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 (右)
• M-%: (Metaキー(Esc)を押して離した後% (shift + 5)を押す)文字列の置換。メッセージ欄にQuery replace:と出るので置換する文字列を入力してEnter •置換後の文字列を入力してEnter •ファイルを上から検索するので置換したい場合はy,しない場合はnをそれぞれ入力• C-I: (エル)カーソルのある行が中央に来るように表示領域を移動
• emacsでファイル(test.txt)を編集して保存すると保存前のファイルがtest.txt~という名前でディレクトリに残る。元に戻したいときはmvコマンドを使って戻すことができる。 •一個前のバージョンしか保存されない。 test.txt〜に保存前のデータが保存される*は任意の文字列ohara.nobuo.ga@icho:~/compphys2/3rd$ emacs -nw test.txt hinohara nobuo ga@icho:~/compphys2/3rd$ ls test.txt× test.txt | test.txt~ ninohara.nobuo.gaoicho:~/compphys2/3rd$|diff test.txt test.txt~ < V test hinohara.nobuo.ga@icho:~/compphys2/3rd$ 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行数 ファイル名：ファイルの下から指定行だけを表示長いファイルの一部だけを見たい場合に便利。
[hinohara.nobuo.ga@icho:~/compphys2/3rd$ head_test.txt 0 test 1 physics行数を指定しない場合は10行表示
hinohara.nobuo.ga@icho:~/compphys2/3rd$ tail test.txt 11 divergence 12 ratio nオプションなしで13 Maxwell下から10行を表示14 factor hinohara.nobuo.ga@icho:~/compphys2/3rd$ tail -n 5 test.txt
wcファイル名[hinohara.nobuo.ga@icho:~/compphys2/3rd$ wc test.txt 21  43 254 test.txt hinohara.nobuo.ga@icho:~/compphys2/3rd$ test.txtファイルは21行、43単語、254バイトであることが表示される(word count)ちなみにこのディレクトリにtest.txtファイルしかない場合はタブ補完が使えます。 wcとスペースを入力後タブキーで自動的にtest.txtが補完されます。(他のコマンドの場合も)

sortファイル名
|hinohara.nobuo.ga@icho:~/compphys2/3rd$ sort test.txt 0 test 1 physics 10 rotation 11 divergence 12 ratio 13 Maxwell 14 factor 15 quantum mechanics 16 electromagnetics 17 statistics 18 atom 19 molecule 2 mathematics 20 science 3 mechanics 4 equation 5 computer 6 analysis 7 integration 8 derivative 9 method先頭の文字順に並び替え
sort –nファイル名
hinohara.nobuo.ga@icho:~/compphys2/3rd$ sort -n test.txt 0 test 1 physics 2 mathematics 3 mechanics 4 equation 5 computer 6 analysis 7 integration 8 derivative 9 method 10 rotation 11 divergence 12 ratio 13 Maxwell 14 factor 15 quantum mechanics 16 electromagnetics 17 statistics 18 atom 19 molecule 20 science -nオプションで数値順で並び替え(もともとと同じ並び)

sort –rファイル名
|hinohara.nobuo.ga@icho:~/compphys2/3rd$ sort -r test.txt 9 method 8 derivative 7 integration 6 analysis 5 computer 4 equation 3 mechanics 20 science 2 mathematics 19 molecule 18 atom 17 statistics 16 electromagnetics 15 quantum mechanics 14 factor 13 Maxwell 12 ratio 11 divergence 10 rotation 1 physics 0 test文字列として逆順にソートして出力sort –nrファイル名(-n –rや–rnもOK) |hinohara.nobuo.ga@icho:~/compphys2/3rd$ sort -nr test.txt 20 science 19 molecule 18 atom 17 statistics 16 electromagnetics 15 quantum mechanics 14 factor 13 Maxwell 12 ratio 11 divergence 10 rotation 9 method 8 derivative 7 integration 6 analysis 5 computer 4 equation 3 mechanics 2 mathematics 1 physics 0 test
数値で逆順にソートして出力

sort -k列数ファイル名
|hinohara.nobuo.ga@icho:~/compphys2/3rd$ sort -k 2 test.txt 17 statistics 0 test 2列目の値で並び替えて出力。大文字のMが先頭に来て小文字のaから順に並んでいる。
grep文字列ファイル名 でファイルの中から文字列を含む行のみを出力1 physics 2 mathematics 3 mechanics 17 statisticsオプション-n行番号をつける-v文字列を含まない行だけを出力-i文字列の大文字と小文字を区別しないgrepでは正規表現(regular expression)を使うことができる。正規表現の詳細は省略するが色々な文字列を一つの文字列で表現できる。grep正規表現などで検索すると多くの情報を見つけることができる。
sedとは：Stream Editor。読み込んだファイルに対して処理を行い、結果を標準出力に出力する。(結果をファイルに保存したい場合はリダイレクトを使う)文字列の置換 sed ‘s/置換前文字列/置換後文字列/g‘ ファイル名[hinohara.nobuo.ga@icho:~/compphys2/3rd$ sed 's/mechanics/theory/' test.txt 0 test 1 physics 2 mathematics 3 theory 4 ' Equal film 5 computer 6 analysis 7 integration 8 derivative 9 method 10 rotation 11 divergence 12 ratio 13 Maxwell    mechanicsだったところがtheoryに置換されている14 factor 15 quantum theory 16 electromagnetics gフラグがない場合は一行に複数のmechanicsが含まれている場合17 statistics   はじめの一つだけ置換してその行の処理は終了する。 18 atom 19 molecule一行にある複数のmechanicsを全て置換する場合はgフラグをつける。 20 science
特定の行を削除：sed ‘行番号d’ファイル名行1から行2までを削除：sed ‘行番号1、行番号2d’ファイル名文字列を含む行を削除：sed ‘/文字列/d’ファイル名[hinohara.nobuo.ga@icho:~/compphys2/3rd$ sed '2,4d' test.txt 0 test 2-4行目を削除4 equation 5 computer 6 analysis 7 integration 8 derivative Ocmothed hinohara.nobuo.ga@icho:~/compphys2/3rd$|sed '3d' test.txt 0 test 3行目を削除1 physics 3 mechanics 4 equation 5 computer analycid [hinohara.nobuo.ga@icho:~/compphys2/3rd$ sed '/ics/d' test.txt 0 test文字列icsを含む行を削除4 equation 5 computer 6 analysis 7 integration 8 derivative最終行は$でも表すことができる2行目から最終行までを削除hinohara.nobuo.ga@icho:~/compphys2/3rd$ sed '2,$d' test.txt 0 test
ある行の直前に文字列を挿入：sed ‘行番号i文字列’ファイル名ある行の直後に文字列を挿入：sed ‘行番号a文字列’ファイル名hinohara.nobuo.ga@icho:~/compphys2/3rd$ sed '2i biology' test.txt û test 2行目(1 physics)の直前にbiologyの文字列からなる行を挿入biology i physics 2 mathematics 3 mechanics 4_equation hinohara.nobuo.ga@icho:~/compphys2/3rd$ sed '2a biology' test.txt 0 test 2行目(1 physics)の直後にbiologyの文字列からなる行を挿入1_physics biology 2 mathematics 3 mechanics 4 equation
ある行を文字列で上書き：sed ‘行番号c文字列’ファイル名[hinohara.nobuo.ga@icho:~/compphys2/3rd$ sed '2c 1 biology' test.txt 0 test 2行目(1 physics)を’1 biology’文字列で上書き1 biology 2 mathematics 3 mechanics 4 equation 5 computer 6 analysis 7 integration
• awk(オーク)とは：テキスト処理を行うプログラミング言語。 •ファイルを読み込み1行ずつ処理が行われる•書式は　awkパターン‘{アクション}’ファイル名•よく使うのは列の取り出し。複雑な処理も可能だがPythonなど他の言語を使うことが多い。 hinohara.nobuo.ga@icho:~/compphys2/3rd$ awk '{print $2}' test.txt test physics 2列目を出力mathematics mechanics equation computer
hinohara.nobuo.ga@icho:~/compphys2/3rd$ lawk '{print $2, $1}' test.txt test 0 physics 1 2列目、1列目の順に出力mathematics 2 mechanics 3レコードは”,”で区切るequation 4 computer 5 hinohara.nobuo.ga@icho:~/compphys2/3rd$ awk '{print $1, $2, 0 test 0 1 physics 1列目、2列目、1列目の順に出力2 mathemattics 2 5 mechanics 5 4 equation 4 5 computer 5 6 analysis 6
• diff: ２つのファイルの差分を表示する• uniq:重複行を削除• cut:一部の列だけを取り出すリダイレクト・パイプライン
•コマンド実行の基本的な動作： •コマンドを入力→端末の画面の次の行に結果が出力•コマンドの出力は標準出力(stdout; standard output)に出力されるようになっている。 •シェルで標準出力=画面への出力という設定になっている
•標準出力のリダイレクト
•標準出力を画面ではなく指定したファイルに出力•書き方　コマンド(オプション、ファイルなど含む) >出力ファイル[hinohara.nobuo.ga@icho:~/compphys2/3rd$ head -n 2 test.txt 0 test 1 physics hinohara.nobuo.ga@icho:~/compphys2/3rd$ head -n 2 test.txt > head.txt |hinohara.nobuo.ga@icho:~/compphys2/3rd$ |cat head.txt| 0 test 1 physics headコマンドを実行すると画面(標準出力)に結果が出力される出力結果をhead.txtにリダイレクト画面上には何も表示されないhead.txtファイルの中身をcatで確認するとhead –n 2 test.txtの結果が保存されている
標準出力のリダイレクトをすでに存在するファイルに対して行うと上書きされる。上書きではなく追記をしたい場合は>>を使う
head.txtファイルを作るすでに存在するファイルに対してリダイレクトすると上書きされる
・コマンドを実行すると画面にエラーメッセージが出力されることがある。 •コマンドのエラーメッセージは標準出力ではなく標準エラー出力(stderr; standard error)に出力されるようになっている。 •シェルでは標準エラー出力＝画面への出力に設定されている•標準エラー出力をファイルヘリダイレクトするには2>を使う[hinohara.nobuo.ga@icho:~/compphys2/3rd$ a a:コマンドが見つかりませんhinchara nobuo gadichor^/comphys2/3rd$ a > error a:コマンドが見つかりません[hinohara.nobuo.ga@icho:~/compphys2/3rd$ cat error [hinohara.nobuo.ga@icho:~/compphys2/3rd$|a 2> error [hinohara.nobuo.ga@icho:~/compphys2/3rd$ cat error a:コマンドが見つかりません存在しないコマンドを実行するとエラーメッセージが出力される標準出力をリダイレクトしてもエラーメッセージは画面に出力されerrorファイルには何も書かれていない標準エラー出力をリダイレクトすると画面には何も出力されなくなり、 errorファイルにエラーメッセージが書き込まれる
.コマンドの中には標準入力(stdin; standard input)から値を受け取って結果を表示するものがある。 •シェルで標準入力＝キーボードからの入力となっている標準入力をファイルにリダイレクトするにはコマンド<ファイル名とする. catコマンド：標準入力(キーボードからの入力)からの入力を標準出力(画面)に表示する終了するにはC-d (または強制終了のC-c)ファイルの中身が標準出力に表示される例えばcat < head.txt > head.outとするとhead.txtの内容をhead.outに出力となる。 C-dで終了
標準入力をinputファイルから読み込み標準出力をoutputファイルに書き出し、標準エラー出力をerrorファイルに書き出したい場合コマンド< input > output 2> error標準出力と標準エラー出力両方をoutputファイルに書き出す場合コマンド> output 2>1&標準出力をどこにも出力したくない場合(出力が大量でいらない場合など)コマンド> /dev/null /dev/nullファイルに書き込まれたデータはすべて破棄される。(nullデバイス)
・コマンドの出力結果(標準出力)を他のコマンドの標準入力に渡す・コマンド1｜コマンド2とするとコマンド1の標準出力がコマンド2の標準入力に渡される(縦棒は右上のBackspaceの隣のキーをshiftキーと一緒に押す) hinohara.nobuo.ga@icho:~/compphys2/3rd$|head -n 5 test.txt 0 test 1 physics 2 mathematics 3 mechanics 4 equation hinohara.nobuo.ga@icho:~/compphys2/3rd$ head -n 5 test.txt | sort -k 2 4 equation 12 mathematics 3 mechanics 1 physics 0 test
test.txtの先頭から5行をsortコマンドの標準入力にわたすsortコマンドでは2列目で並び替えを行った結果を標準出力(画面)に表示hinohara.nobuo.ga@icho:~/compphys2/3rd$ head -n 5 test.txt | sort -k 2 | head -n 1 4 equation sortコマンドの出力をheadコマンドに渡し、先頭の1行だけを標準出力test.txtファイルの先頭から5行を標準出力(画面)に表示表示
historyコマンド。何百行も表示される。 history｜lessとすることで先頭から順番に表示することができる複数のコマンドを順に適用して処理ができるのでプログラムを書かなくても簡単な処理が可能
wgetインターネットアドレス（URL） ：指定したURLのファイルをダウンロードする授業のホームページからx2.txtをダウンロードhinchara.nobuo.ga@icho:~/compphys2/3rd$| wget  https://wwnucl.ph.tsukuba.ac.jp/~hinohara/compphys2-22/doc/x2.txt —2022-10-20 17:06:59—  https://wwnucl.ph.tsukuba.ac.jp/~hɪnohara/compphys2=22/doc/x2.txt wwwnucl.ph.tsukuba.ac.jp (wwwnucl.ph.tsukuba.ac.jp)をDNSに問いあわせています... 130.158.70.169 wwnucl.ph.tsukuba.ac.jp (wwnucl.ph.tsukuba.ac.jp)|130.158.70.169|:443に接続しています...接続しました。 HTTPによる接続要求を送信しました、応答を待っています... 200 OK長さ： 462 [text/plain] 'x2.txt'に保存中x2.txt 462  ---KB/s 2022-10-20 17:06:59 (69.7 MB/s) - `x2.txt'へ保存完了[462/462] hinobara.nobuo.ga@icho:~/compphys2/3rd$ ls保存完了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/ディレクトリの圧縮はディレクトリの外から行うhinohara.nobuo.ga@icho:~/compphys2$ ls 3rd/ error head.txt test.txt x2.txt x2data.txt |hinohara.nobuo.ga@icho:~/compphys2$|tar czvf 3rd.tgz 3rd 3rd/ 3rdディレクトリを3rd.tgzファイルに圧縮3rd/x2.txt 3rd/error 3rd/head.txt 3rd/test.txt 3rd/x2data.txt |hinohara.nobuo.ga@icho:~/compphys2$ ls 3rd/  3rd.tgz
• tarコマンドによる解凍： tar zxvf圧縮ファイル• x:解凍のオプション|hinohara.nobuo.ga@icho:~/compphys2$ |mv 3rd 3rd.bak hinohara.nobuo.ga@icho:~/compphys2$ ｌｓ　　すでに3rdというディレクトリがあるので3rd.bak/  3rd.tgz名前を変えておくhinohara.nobuo.ga@icho:~/compphys2$ tar zxvf 3rd.tgz 3rd/ 3rd.tgzをこのディレクトリに解凍Brd/x2.txt 3rd/error 3rd/head.txt 3rd/test.txt 3rd/x2data.txt hinohara.nobuo.ga@icho:~/compphys2$ ls 3rd/  3rd.bak/  3rd.tgz解凍したディレクトリが現れるこの他にbz2圧縮形式による.tar.bz2 (tbz)という拡張子もLinuxでは用いられる。 zの代わりにjオプションを用いる
・manabaから提出(提出任意・成績には反映しません) 1. historyコマンドであなたが端末にこれまで(の一定期間)に入力したコマンドの一覧が出力されます。これまでにIsコマンドを入力した回数のみを標準出力に出すにはどのようなコマンドを入力すればよいですか？ (grep,パイプライン, wc, awkなどを使うと1行で書けます)。これまでに何回lsを入力していましたか？ (タイプミスも含めてlsを含むコマンドを打った場合、でOK)
2.次のファイルx2.txtをhttps://wwwnucl.ph.tsukuba.ac.jp/~hinohara/compphys2-22/doc/x2.txtからダウンロードして表示してみましょう。(wgetコマンドでダウンロード) y=x²を計算したものですが、数字以外の情報が多くて扱いにくいです。 x2.txtから右のような数字のみ取り出したx2data.txtファイルを作成するにはリダイレクト、パイプライン、grep、 sed、awkなどを使って(一行のコマンドで)どのように書けますか。 hinohara.nobuo.ga@physicslinux1:~/3rd$ cat x2.txt calculate y = x**2 0.0 y =    0.0 calculate y = x**2 1.0 v =    1.0 calculate v = x**2 2.0 v =    4.0 calculate y = x**2 3.0 v =   9.0 calculate y = x**2 4.0 y =   16.0 calculate y = xxx2 5.0 y =   25.0 alculate y = xxx2 6.0 y =   36.0 calquiate v = x**2 7.0 v =   49.0 calculate v = xxx2 8.0 y =   64.0 calculate v = xxx2 9.0 y =   81.0 calculate y = x**2 x =   10.0 y =  100.0 hinohara.nobuo.ga@physicslinux1:~/3rd$ cat x2data.txt 0.0 0.0 1,0 1,0 2.0 4.0 B,0 9,0 .4 16.4 0.6 25.6 8.4 b4.4 9.0 81L 6 10.0 100.0