コン実習テスト
===
# 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
```