コン実習テスト === # Unix操作 `pwd` : カレントディレクトリ表示 `ls` : ファイルリスト - -a : 全ファイル - -l : 詳しく - -F : ファイル属性 - -d : ディレクトリ自体の情報を表示 - -R : 下のディレクトリの中も表示 `man` : マニュアル - q : 終了 - space : 1ページ進む - b : 戻る - p : 先頭ページへ `mkdir` : メイクディレクトリ `rmdir` : リムーブディレクトリ `cp file file/dir`:コピー `rm file`:リンク削除 `mv file file` :ファイル名変更 `mv file dir` :ファイル移動 `touch file` :ファイル作成 `cat file` :ファイル内容表示 `less file` :ファイル内容を1画面ずつ表示(qで抜ける) # 4-ファイルシステム /etc システム設定 /bin 一般的なコマンド /sbin システム管理コマンド /lib ライブラリ /var ログなど /tmp 一時ファイル /usr システム起動に必要ないコマンドやライブラリ `which programName` プログラムファイルのパス名を表示する `file fileName` ファイルタイプを表示する ### ファイルの抽象化 通常のファイル、ディレクトリ、デバイスなどはそれぞれファイルとして扱える ### ユーザーとグループ `id`:ユーザID(uid)を表示 `groups userName`:グループID(gid)を表示 ### ファイルの詳細 `ls -l` - ファイルの種類 - パーミッション - リンク数 - 所有者とグループ - サイズ - 最終更新日時 - ファイル名 ### パーミッション r , w , x , - `chmod mode fileName` 対象ユーザ + , - 権限 - u : 所有者 - g : 同一グループのユーザ - o : その他のユーザ - a : すべてのユーザ ``` chmod go+r a.txt //閲覧可能 chmod +x a.sh //実行可能 chmod 644 a.txt ``` ### リンク **ハードリンク** `test.txt: 12345678` ファイル名:OS内部の識別子 `ln sourceFileName targetFileName` : make links **シンボリックリンク** `test.txt -> 12345678` `ln -s sourceFileName targetFileName` : make links シンボリックリンクはリンク数にカウントされない.実体を消すとアクセスできなくなる # 5-シェル・プロセス制御・ジョブ制御 ### シェル操作 C-f :right C-b :left C-d :delete C-h :Back space C-k :cut C-u :undo C-y :paste ### ワイルドカード \* :任意の文字列 ? :任意の1文字 [] :いずれかの文字 {} :いずれかの文字列 ``` ??.?? 文字数で指定 ab[12] bの次が1か2 ab[0-9]bの次が0-9 ab[a-z] ab[A-Z] \*.{txt,doc} ``` ### 履歴実行 `history` : 履歴表示 `!!` : 直前を再実行 `!10` : 10番めの再実行 `!string` : 特定の文字列で始まるのを再実行 `:p` : をつけると実行せずにコマンドを表示する `^string1^string2^` : 直前のコマンドの文字列を変更して実行 `!$` : 直前のコマンドの最後の引数を表す `history | grep command` : 履歴から検索する ``` ls -a test.txt cat !& //cat test.txt ``` ### プログラムとプロセス プロセスは実行中のプログラム 命令がメモリに配置されCPUが実行している状態 ### プロセス制御 プロセスを終了する プロセスを中断する プロセスを再開する `ps`:プロセスの状態を表示する(process status) - a :すべてのユーザのプロセス - x :制御端末のないプロセスも表示 - l,j,u :詳細表示 ### ジョブとジョブ制御 ジョブ:組み合わされた一連のプロセスの集合 `jobs`:ジョブの一覧 - +:現在のジョブ - -:直前のジョブ - [n]:ジョブ番号 **プロセスの強制終了** ターミナルで`C-c` 別のターミナルで`kill pid` 別のターミナルで`kill %jobNumber` ジョブの一時停止とバックグラウンドでの実行再開 `C-z`:フォアグラウンドの実行を一時停止 `bg %jobNumber`:バックグラウンドで実行再開(省略すると直前の) `fg %jobNumber`:バックグラウンドのをフォアに持ってくる # 6-リダイレクトとパイプ ### 標準入出力 stdin stdout stderr in -> out/err デフォルトではinはキーボード、out/errは画面 ### リダイレクト シェルからでin/out/errを切り替える stdoutのリダイレクト `command>fileName` `ls > file.txt`:lsの結果をファイルに出力する `la >> file.txt`:既存ファイルの末尾に追加される stderrのリダイレクト `command 2> file.txt` `command 2>> file.txt` out/err組み合わせリダイレクト `command > file1.txt 2> file2.txt`:outをfile1に、errをfile2に出力 `command &> file.txt`:一つのファイルにまとめて出力 stdinのリダイレクト `command < file.txt` in/outの組み合わせ `command < file1 > file2` ### パイプ あるコマンド間の入出力をつなげる(3つもいける) `command1 | command2` : 無名パイプ `[command] | less` `wc [-cwl] file` : 文字数、単語数、行数を表示する(word count) - -c :文字数 - -w :単語数 - -l :行数 ``` ls dir | wc -l //ディレクトリにあるファイル数を調べる ``` ### grep `grep [-inv] pattern fileName` : パターンにマッチする行を表示する patternは正規表現 - -i :大文字小文字を区別しない - -n :行番号表示 - -v :パターンにマッチしない行を表示する ``` grep –i general meibo.txt | grep –i female //総務部の女性だけを抜き出す ``` ### sort `sort [-bfnr] [-k field1[,field2]] [file ...]` : ファイルをソートして画面に表示 - -b 先頭の空白を無視する - -f 大文字小文字を区別しない - -n 数値として評価 - -r 降順ソート - -k 対象フィールドの指定(二つ指定すればその間) ### head / tail `head -n N fileName` : ファイルの先頭のN行を表示する `tail -n N fileName` : ファイルの最終部分N行を表示する ### パイプによるコマンドの組み合わせ ``` sort -bk 6 meibo.txt > height.txt //sortしてファイルに出力 sort –bnrk 7 meibo.txt | head –n 5 //ポイントが高い社員の上位5人(降順) grep – i sales meibo.txt | sort –bnk 7 | tail –n 5 //Salesのうち,ポイント上位5人(昇順) ``` # 7-シェルの設定、ネットワーク利用、アーカイブ ### alias `alias newName='command'`:コマンドに別名をつける `unalias newName`:エイリアスを解除 `alias`:一覧表示 ### シェル変数 シェルの動作を制御する `set`:シェル変数の一覧 `echo $name`:シェル変数の値表示 `name=10`:シェル変数の設定 `unset name` ### コマンドのパス コマンドを使うためには実行可能ファイルのパスが必要 1-フルパスを指定する `/usr/bin/ls` 2-PATHにコマンドファイルを探すディレクトリを指定しておく `PATH=${PATH}:/usr/bin` ### コマンドと実行形ファイル `type -a command`:コマンドの種類を調べる ### 環境変数 `LANG`などのシェルからコマンドに渡される変数 `printenv` : 一覧表示 `echo $name` : 設定する `export name=value` : 設定解除 `=value`を省略→既存のシェル変数を環境変数とする ### 初期設定ファイル シェル起動時に実行され、alias, シェル変数, 環境変数などを設定する シェルスクリプトでかかれる ``` ~/.bash_profile //ログイン時 ~/.bashrc //シェル起動時 ``` `source fileName(上記のやつ)`:変更をすぐに反映 ### pushd,popd,dir cdの履歴の活用 `pushd` : cdを実行し、履歴をスタックにプッシュ `dirs` : cdの履歴スタックを表示 `popd` : 履歴を活用してもとのディレクトリに戻る ### gzip/gunzip `gzip file` : ファイルの圧縮(.gz) `gunzip file` : 展開 `zcat file` : 圧縮したファイルを展開せずに表示 ### tar 複数のファイルを一つにしたもの `tar cvf archFilename files` : アーカイブ作成 - c : アーカイブファイルを作成(.tar) - v : 詳細な情報を表示 - f : アーカイブファイル名を指定 ``` tar cvf srcfiles.tar src1.py src2.py src3.py tar cvf src_dir.tar src_dir //ディレクトリ以下すべて ``` `tar tvf archFile` - t : ファイルリストを表示 `tar xvf archFile [file]` - x : ファイルを取得 ``` tar xvf srcfiles.tar tar xvf srcfiles.tar src1.py //ひとつだけ取り出す ``` ### tarとgzip組み合わせ `tar cvzf archFile file` - z : tarしてgzipで圧縮(.tgz) `tar xvzf archive_file [file...] ` - x : ファイルを取得 ``` tar cvzf src_dir.tgz srcdir //圧縮 tar xvzf src_dir.tgz //解凍 ``` ### diff `diff -iw file1 file2` : 行ごとにファイルを比べる - -i : 大文字小文字区別しない - -w : スペースを無視 ### ssh `ssh [user@]host` : 遠隔ログイン ``` $ ssh aa101076@logex00.educ.cc.keio.ac.jp The authenticity of host ’logex00... (131.113.xxx' can't be established. RSA key fingerprint is 8b:6d:07:3d:.... Are you sure you want to continue connecting (yes/no)? yes ``` ### scp `scp [[user@]host1:]file1 ... [[user@]host2:]file2` : ファイル転送 ``` $ scp test1.txt aa101076@logex00.educ.cc.keio.ac.jp:unix-intro //ローカルのtest1.txtをlogex00.educ.cc.keio.ac.jp ~/unix-introにコピー ``` # 8-正規表現 条件に合致する文字列を表現する ### メタ文字 \ ^ $ . [] * {}など `grep -Eo --color pattern file` patternに正規表現を使う場合は`''`でくくる `-E` : 拡張表現に対応 `-o` : マッチしている部分のみを表示 `--color` : 色つき表示 `type -a grep` : ? ### 文字にマッチするメタ文字-1 `.` : 任意の1文字、スペース含む ``` grep ’a.c’ a?.txt //ファイル(a1.txtなど)内から文字列(abcなど)を探す $ echo ’xxxabcxxx’ | grep ’a.c’ $ echo ’xxxacxxx’ | grep ’a.c’ $ echo ’xxxa cxxx’ | grep ’a.c’ ``` ### 文字にマッチするメタ文字-2 `[]` : []に含まれるいずれかの1文字 `[^]` : []に含まれ**ない**いずれかの1文字 ``` t[ef]st //test, abctest [^xy]abc //zabc, xyzabc ``` 範囲指定も可能 ``` [0-9] [a-z] [A-Z] [a-zA-Z] ``` ``` $ echo ’IPv4 IPv6 ICMP ICMPv6’ | grep ’[0-9]’ $ echo ’IPv4 IPv6 ICMP ICMPv6’ | grep’[0-5]’ $ echo ’IPv4 IPv6 ICMP ICMPv6’ | grep’[a-z]’ $ echo ’IPv4 IPv6 ICMP ICMPv6’ | grep’[a-z][0-9]’ $ echo ’IPv4 IPv6 ICMP ICMPv6’ | grep’[^A-Z]’ ``` ### 文字にマッチするメタ文字-3 |メタ文字|意味| |-|-| |¥w|英字、数字| |¥W|英字、数字**以外**| |¥d|数字| |¥D|数字**以外**| |¥s|スペース、タブ| |¥S|スペース、タブ**以外**| |¥n|改行文字| |¥t|タブ| ``` echo 'a - ab + abc / a.c # a_c: 1.2 % 1.23' | grep '\w' echo 'a - ab + abc / a.c # a_c: 1.2 % 1.23' | grep '\w' echo 'a - ab + abc / a.c # a_c: 1.2 % 1.23' | grep '\d' echo 'a - ab + abc / a.c # a_c: 1.2 % 1.23' | grep '\D' echo 'a - ab + abc / a.c # a_c: 1.2 % 1.23' | grep '\s' ``` ### POSIX文字クラス [:alnum:] :英字か数字 [:alpha:] :英字 [:lower:] :小文字 [:upper:] :大文字 [:blank:] :スペースとタブ [:space:] :空白文字(スペース+改行) [:digit:] :10進数の数字 カッコに入れる `[[:alnum:]]` ### エスケープ文字 `\` : 直後のメタ文字の意味を取り消す ``` a\.c //a.c \[bc\] //[bc] ``` ``` echo ’a ab a c a.c a_c’ | grep ’a.c’ //a.c a_c echo ’a ab a c a.c a_c’ | grep ’a\.c’ //a.c ``` ### 位置にマッチするメタ文字 `^` : 行頭 `$` : 行末 ``` ^net net$ ^$ //空行 ``` `\b` : 単語の先頭または末尾 `\B` : 単語の先頭・末尾以外 `\<` : 単語の先頭 `\>` : 単語の末尾 ### 繰り返しを指定するメタ文字 `*` : 0回以上の繰り返し ``` Be*r //Br, Ber, Beer ... B[ea]*r //eかaが0文字以上 .* //任意の文字列 ^ex.*txt$ //exで始まりtxtで終わる行 ``` `\{n\}` : ちょうどn回 `\{n,\}` : ちょうどn回以上 `\{n,m\}` : ちょうどn回以上,m回以下 ``` a\{n\} //aが5回 a\{n,\} //aが5回以上 [1-9][0-9]\{1,2\} //2桁か3桁の数字 ``` ### グループと後方参照 `\(string\)` : 再利用したい文字列を指定 `\n` : n番目にマッチした文字列を表す ``` \(ab\)\1 //abab \(why\).*\1 //whyが2回以上現れる \(["']\).*\1 //""や''でかこまれた文字列 ``` ### 基本表現と拡張正規表現 |BRE|ERE|意味| |-|-|-| | |r+ |正規表現rの1回以上の繰り返し| | |r? |正規表現rが0回か1回| |r* |r* |正規表現rの0回以上の繰り返し| |r\{n\}|r{n}|正規表現rがちょうどn回| |r\{n,\}|r{n,}|正規表現rがn回以上| |r\{n,m\}|r{n,m}|正規表現rがn回-m回| |\\\(r\\\)|\(r\)|正規表現rのグループ化| |r1\\\|r2|r1\|r2|正規表現r1または正規表現r2| |\n| |n番目にマッチした文字列を参照| # ここまで100点 # 9-高度なテキスト処理:sed, awk ### sed ( stream editor ) - 非対話型エディタ - ファイルと sed スクリプトを指定 - 標準出力に出力 (元ファイルはそのまま) - 正規表現が使える ``` sed [–nr] script [file ...] sed [–nr] [–f script_file] [file ...] ``` - –n : 編集した行のみ出力 - –r : 拡張正規表現の使用 - –f script_file : sed スクリプトファイルを指定 - script : sed スクリプト (’ ’ で括る) - file ... : 編集対象のファイル ### sed スクリプト 「アドレス」と「コマンド」を組み合わせ |コマンド|内容|コマンド|内容| |-|-|-|-| |d |行を削除 |a| 行を追加 (アドレスの次の行) | |p |行を表示 |i| 行を追加 (アドレスの前の行) | |s |文字列の置換 |c| 行を置換| ### アドレスの指定 `n` : n行目 `n,m` : n行目からm行目 `n,$` : n行目から最終行 `/^B/` : 先頭がBで始まる行 `/^B/,+2` : 先頭がBで始まる行から2行先まで(3行) `/^B/,$` : 先頭がBで始まる行から最終行 省略すると全行 ### d(行削除) ``` sed ’3d’ fruit.txt // 3行目を削除 sed ’3,5d’ fruit.txt // 3-5行目を削除 sed ’/apple/d’ fruit.txt // appleを含む行を削除 sed ’/^b/d’ fruit.txt // 先頭がbで始まる行を削除 ``` ### ctext(行置換) ``` sed ’4cmelon’ fruit.txt // 4行目をmelonに置換 sed ’/apple/cmelon’ fruit.txt // appleを含む行をmelonに置換 sed ’/^apple/cmelon’ fruit.txt // 先頭がappleの行をmelonに置換 ``` ### atext (次の行に挿入) ``` sed ’4amelon’ fruit.txt // 4行目の次に melon という行を挿入 sed ’/lemon/amelon’ fruit.txt // lemon を含む行の次に melon という行を挿入 ``` ### itext (前の行に挿入) ``` sed ’4imelon’ fruit.txt //4行目の前に melon という行を挿入 sed ’/lemon/imelon’ fruit.txt //lemon を含む行の前に melon という行を挿入 ``` ### s/text1/text2/[g] (置換) ``` sed ’1s/apple/peach/’ fruit.txt //1行目の apple を peach に置換 sed ’s/apple/peach/’ fruit.txt //全行で,行の最初の apple を peach に置換 //1行内に複数の apple がある場合,最初の apple のみが置換 sed ’s/apple/peach/g’ fruit.txt //全行で,行のすべての apple を peach に置換 sed ’s/¥(apple¥)/pine¥1/’ fruit.txt //全行で,行の最初の apple を pineapple に置換 sed ’s/¥(berry¥)/¥1 jam/’ fruit.txt //全行で,berry を berry jam に置換 ``` ### p (指定された行を表示) ``` sed –n ’/berry/p’ fruit.txt //berryを含む行のみを表示 sed –n ’/^b/p’ fruit.txt //先頭が b で始まる行のみを表示 ``` ### スクリプトファイルの利用 ``` // cmd.sed s/¥(apple¥)/pine¥1/ s/¥(berry¥)/¥1 jam/ ``` ``` sed -f cmd.sed fruit.txt ``` ### awk `awk [–F c] script [file ...]` `awk [–F c] [–f script_file] [file ...]` - `–F c` : c をフィールドの区切り文字とする(デフォルトはスペース) - `–f script_file` : awk スクリプトファイルを指定 - `script` : awk スクリプト (’ ’ で括る) - `file ...` : 処理対象のファイル レコード:処理対象ファイルの行 - `NR` : 現在のレコード番号 (= 行番号)を示す組込変数 フィールド:レコード内で空白で区切られた各部分 - 区切り文字は –F c オプションで指定可能 - `$n` : n番目のフィールドの値を参照 - `$0` : 全フィールドの値 (= レコードの内容)を参照 - `NF` : 現在の行のフィールド数を示す組込変数 - `$NF` : 最後のフィールドの値を参照 - `$(NF–1)` : 最後の1つ前のフィールドの値を参照 ### print `print $3,$4` : 空白区切りで表示 `print $3 $4` : 続けて表示 ``` awk '{print $3,$4}' meibo.txt | head -n 5 //部署と年齢のみを表示 awk '$2 ~ /^[AEIOU]/ {print $0}' meibo.txt //名前が母音で始まる人(全フィールド)を表示 awk '$4 > 50 {print $0}' meibo.txt //50歳以上 awk '$NF == "Ski" {print $0}' meibo.txt //趣味がski awk '$4 < 40 && $NF == "Driving" {print $0}' meibo.txt awk '{printf "age: %d, hobby: %s¥n", $4, $NF}' meibo.txt ``` - 正規表現は `/ /` で括る - `~` : は正規表現の比較(==) - `$2 ~ /^[AEIOU]/` : 第2フィールドの先頭はAEIOUのいずれかか? - `NF` : フィールド数 - `$NF` : 最後のフィールド - `NR` : 行数 - `ptrn1,ptrn2` : 間にある行 - `&&` : and - `||` : or - `!ptrn` : not ### printf ``` awk '{printf "age: %d, hobby: %s¥n", $4, $NF}' meibo.txt ``` ### BEGIN / END `BEGIN {action}` : 処理を開始する前に実行するaction `END {action}` : 処理の実行後に実行するaction ``` // 最初にAge Hobbyを表示する awk ‘BEGIN{printf “Age Hobby¥n”} {printf "%3d %s¥n", $4,$NF}' meibo.txt // 平均年齢を計算 awk '{sum += $4} END{print “Average: “ sum/NR}' meibo.txt ``` ### スクリプトファイルの利用 ``` // cat cmd.awk 3 == "General" {g_sum++} 3 == "Sales" {s_sum++} END{ print "General: " g_sum print " Sales: " s_sum } ``` ``` awk -f cmd.awk meibo.txt ``` # 10-シェルスクリプト ``` //ホームディレクトリ以下のファイル数を調べる //filename.sh #!/bin/bash ls –R ~ | grep –v ’^$’ | grep –v ’:$’ | wc -l //実行権限を与える chmod +x filenum.sh ```