---
# System prepended metadata

title: コン実習テスト

---

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

```





