２−１．WEB系エンジニアになるためのインプット（Linux基礎）

#はじめに
こちらの記事の続きとなる。
[１−１．WEB系エンジニアになるためのインプット（準備）](https://qiita.com/Moriyoshi_05/items/1ffb4c9f81311c1fcf77)
Linux基礎を作るためにインプットとそのアウトプットの記事となります。
また、内容が多いため記事を分けて掲載する。

先の記事でも記載しておりますが、教材と環境は下記の通りです。
・教材はUdemy for businessを活用する。
　[【5日でできる】はじめての Linux 入門（LPIC Level1対応）](https://www.udemy.com/course/5dayslinux/)
　（講師：井上 博樹 (Hiroki Inoue)）
・Linux環境（Ubuntu）はAWSのEC2インスタンスを活用する。
　-リージョン：アジアパシフィック (東京)ap-northeast-1
　-AMI：Ubuntu Server 20.04 LTS (HVM), SSD Volume Type
　-インスタンスタイプ：t2.micro

#Linuxのコマンド（UNIX）
Linuxを操作するためのコマンドを記述していく。
ただし、自身が既に扱える箇所は省かせていただきます。
##相対パスと絶対パス
###絶対パス
ルートディレクトリからのパスを全て入力。

```Bash
/usr/local/bin/***
```

###相対パス
カレントディレクトリからの相対的な位置関係を指定。

```Bash:現在の位置
./
```

また、/usr/local/binから/usr/local/を指定したいときは下記を使う。

```Bash:1つ上の階層
../
```

##シェルの操作
###シェルの種類
+ bash
+ csh
+ tcsh

標準はbash(bourne again shell)となる。

###コマンドの履歴
historyコマンドを使う。

```Bash:コマンドの履歴
history
```
また、過去のコマンドには番号が振られており、番号を使って再利用できる。
これにより、タイプミスを防ぐことができる。
例えば、[117 pwd]という履歴があった場合の再利用コマンドは下記

```Bash:コマンドの再利用
!117
```

###コマンドラインの先頭と末尾
コマンドラインに入力した文字が長い時、矢印キーで横に進むのはめんどくさい！そこで一発で移動する方法があります。

```:先頭に移動
Ctr + a
```

```:末尾に移動
Ctr + e
```

##シェル変数
コマンドライン上で変数を作って確認する

```Bash:変数の作成
INFILE="infile.txt"
```

下記コマンドで[infile.txt]と表示され、確認できる。

```Bash:変数の確認（１）
echo $INFILE
もしくは
echo "$INFILE"
```

下記コマンドの場合は[$INFILE]と表示される。

```Bash:変数の確認（２）
echo '$INFILE'
```

下記コマンドで変数のリセットができる。変数の確認（１）で、リセットされていることが確認できる。（空白が表示）

```Bash:変数のリセット
unset INFILE
```

##環境変数
envコマンドで環境変数の設定を確認できる.

```Bash:環境変数の確認
env | more
※moreでスクロールで中身を確認できる
```

環境変数を追加したいときは下記コマンド

```Bash:環境変数の追加
export INFILE
```

##viエディタ
テキストエディタの使い方を記載する。
例えば、result.txtをテキストエディタで開く場合は下記コマンド。
また、このファイルが存在しない場合は新規作成も同時に行われる。

```Bash:テキストエディタ
vi result.txt
```

操作方法が複雑のため、下記表にまとめた。

|カテゴリ|コマンド|内容|
|:---|:---|:---|
|終了キー|:q|セーブしないで終了|
| |:q!|変更した行もセーブせずに終了|
||:w|セーブするが終了しない|
||:wq|セーブして終了|
|編集モードへ移るキー|i|現在のカーソル位置から挿入|
||R|現在のカーソル位置から置換|
||A|現在行の末尾に追加|
||O|現在行の前に行挿入|
||o|現在行の次に行挿入|
|カーソル移動キー|h(←)|左|
||j(↓)|上|
||k(↑)|下|
||l(→)|右|
||0|行頭へ|
||$|行末へ|
||[Enter]|次の行の先頭へ|
||w|次の単語へ|
||b|前の単語へ|
||ctrl + f|次画面へ|
||ctrl + b|前画面へ|
||1G|文頭へ|
||G|文末へ|
||nnG|nn行目へ|
|変更キー|x|１文字削除|
||dd|１行削除（カット）|
||cw|１語変更|
||c$|カーソル位置から行末まで変更|
||dw|１語削除|
||d$|カーソル位置から行末まで削除|
|検索|/正規表現|前方検索|
||?正規表現|後方検索|
||n|次の候補|
||N|前の候補|
|置き換え|：1,$s/正規表現/置き換え文字列/g|文書内の全ての「正規表現」を「置き換え文字列」に置換|
|ショートカット|yy|１行コピー|
||dd|１行カット|
||p|ペースト（張り付け）|

##ファイルの操作
###lsのオプション
```Bash:隠しファイルも含めて表示
ls -a
```

```Bash:ファイルの詳細
ls -l
```

```Bash:隠しファイルも含めて、ファイルの詳細（組み合わせ）
ls -la
```

```Bash:iノード番号も表示
ls -i
```

###ファイルの属性を確認

```Bash:属性を確認
file text.txt
```

###ファイルのコピー（ddコマンド）
[if=]はコピー元ファイル名、[of=]はコピー先ファイル名、[bs]はコピーするブロックサイズ（バイト）、[count]はコピーするブロックの数

```Bash:ファイルのコピー(dd)
dd if=/dev/zero of=zero.dat bs=512 count=1024
```

###ファイルのコピー（cpコマンド）
コピー元をhello.txt、コピー先をhello1.txtとすると下記
コピー元のhello.txtは残ったままとなる。

```Bash:ファイルのコピー(cp)
cp hello.txt hello1.txt
```

###ファイルの削除
```Bash:ファイルの削除
rm hello2.txt
```

###ファイルの移動
移動するファイルをhello2.txt、移動先をsourcecodeとする。
元のhello2.txtは移動して、元のディレクトリからは無くなる。

```Bash:ファイルの移動
mv hello2.txt sourcecode/
```

###ディレクトリの削除
そのままではその中にディレクトリが格納されていると削除できないので、オプションをつけて強制的に削除する

```Bash:ディレクトリの強制削除
rm -fR sourcecode
```

##ファイルの検索
ディレクトリにあるファイルを検索することができる.
例えば、今いるディレクトリに[networks]と付くファイル名を一覧で表示するためのコマンドは下記となる。
また、sudoをつけることで許可がないファイルに対する検索エラーを回避することができる。

```Bash:名前指定のファイル検索
sudo find . -name networks
```

##圧縮とアーカイブ
圧縮・展開方法にはいくつか種類がある

+ tar
+ gzip(=gunzip) tarと併せて使う
+ bzip2 tarと併せて使う
+ xz
+ cpio バックアップ装置と一緒に使う

##tarコマンド
tarコマンドが主流のため、こちらを学ぶ

###オプション
|オプション|内容|
|:---|:---|
|f|ファイル名|
|c|作成|
|x|展開|
|r|末尾に追加|
|v|詳細を表示|
|j|bzip2ファイルを扱う|
|z|gzipファイルを扱う|

###圧縮
tarを使って、work2というディレクトリを圧縮し、work2.tar.gzというファイルを作成するコマンドは下記となる。
また、zオプションによりgzipも併せて使って圧縮する。
なお、tarコマンドで圧縮した元のファイルやディレクトリは残る。
tarコマンド単体で展開したときは圧縮ファイルは残る。

```Bash:圧縮
tar czf work2.tar.gz work2
```

###展開
圧縮して作成されたファイルを展開するコマンドは下記となる。

```Bash:展開
tar xvzf work2.tar.gz
```

###gzip単体の場合
tarコマンドと併せないで、単体でgzipを使える。
text.txtをgzipで圧縮すると、text.txt.gzファイルが生成される。

```Bash:gzip単体で圧縮
gzip text.txt
```

```Bash:gzip単体で展開
gzip -vd text.txt.gz
※vは詳細を表示
```

gzipコマンド単体で展開したときは圧縮ファイルは消える。

###bzip2コマンドの場合
使い方はgzipコマンド単体と同じとなる。圧縮されて生成されるファイルはtest3.txt.bz2となる。

###xzコマンドの場合
使い方はgzipコマンド単体と同じとなる。圧縮されて生成されるファイルはtest3.txt.xzとなる。

###cpioコマンドの場合
CPIOlコマンドには3つのモードがある。

+ コピーアウトモード
+ インサートモード
+ コピーパスモード

ファイル名一覧が格納されたfilelist.txtとしたとき、アーカイブファイルを作成するには下記コマンドとなる。

```Bash:cpioコマンドでの圧縮
cpio -o < filelist.txt > files.cpio
もしくは
ls | cpio -o > files.cpio
```

```Bash:cpioコマンドでの展開
cpio -i < files.cpio
```

また、コピーパスモードによりファイルの移動もできる。
例えば、copytoというディレクトリに移動するコマンドが下記となる。

```Bash:cpioコマンドのコピーパスモード
cpio -pd copyto < filelist.txt
```

##リンク
ファイルに別の名前でアクセスする仕組み

+ ハードリンク：同じiノードに異なる名前
+ シンボリックリンク：iノード番号を持たない。別名のみ管理

ファイルシステムとは「ファイルを管理するし仕組み」（VFS)であり、各デバイスとはiノードを使って関連つけている。

###ハードリンク
ハードリンクを作成するのはlnコマンドを使う。この２つを比較すると、それぞれは同じiノードを持っていることが確認できる。片方を削除してももう片方は参照できる。

```bash:ハードリンクの作成
ln test.txt sample.txt
```

```bash:iノードの確認
ls -li
```

###シンボリックリンク
ハードリンクを作成するのはlnコマンドを使う。この２つを比較すると、異なるiノードを持っており、sample.txtがtest.txtに紐づいていることが確認できる。元のファイルを削除するともう片方は参照できなくなる。

```bash:シンボリックリンクの作成
ln -s test.txt sample.txt
```

```bash:iノードの確認
ls -li
```

##ストリーム＆パイプ＆リダイレクト
###標準入出力

|入出力|役割|
|:---|:---|
|標準入力（stdin[0])|入力チャネル|
|標準出力(stdout[1])|出力チャネル|
|標準エラー(stderr[2])|エラーを出力するチャネル|

###リダイレクト

|リダイレクト|動作|
|:---|:---|
|cmd > file|出力をリダイレクト|
|cmd >> file|出力をファイルにアペンド（追加）|
|cmd < file|入力のリダイレクト|
|cmd << xxx|入力終端文字列の指定（EOFなど）|
|cmd 2> file|エラー出力をファイルに|
|cmd file 2>&1|標準出力とエラー出力をファイルに|

###パイプ

|リダイレクト|動作|
|:---|:---|
|cmd1 &#124; cmd2|cmd1の標準出力をcmd2の標準入力に渡す|
|cmd1 2>&1 &#124; cmd2|cmd1の標準出力とエラー出力をcmd2の標準入力に渡す|
|cmd1 &#124; tee file &#124; cmd2|cmd1の標準出力をfileに書き込み、cmd2の標準入力に渡す|


###テキストストリームとフィルタ
cutコマンドを利用する

```bash:cutコマンド
cut [オプション] ファイル名
```

|オプション|機能|
|:---|:---|
|-d:|区切り文字の指定。左の場合は「:」|
|-f*,*|処理対象の番号指定|

例えば、[root: x:0:0:root:/root:/bin/bash]からユーザ名とホームディレクトリを取り出すコマンドは下記となる。

```bash:cutコマンド
cut -d: -f1,6 passwd
```

##正規表現と検索
正規表現とは文字列集合をパターン化すること

+ メタキャラクター：なんらかの文字を表すための文字
+ リテラル：文字そのもの

###メタキャラクタ

|表現|機能|
|:---|:---|
|^word|行の先頭が一致|
|$word|行の末尾が一致|
|.|任意の一文字|
|*|直前の文字の繰り返し|
|?|直前の文字の0個または1個に一致|
|+|直前の文字の1回以上の繰り返し|
|[]|[]うちのいずれか一文字にマッチ|
|¥< word ¥>|単語にマッチする文字列|
|¥{n,m¥}|n回以上、m回以下の繰り返し|
|&#124;|複数条件を指定|
|¥|次の文字をメタキャラクタではなくリテラルに|

###文字クラス
|表現|機能|
|:---|:---|
|[:alnum:]|アルファベットと数字|
|[:alpha:]|アルファベット|
|[:digit:]|数字|
|[:lower:]|小文字|
|[:upper:]|大文字|
|[:space:]|スペース|

###リテラル
文字そのもの。メタキャラクタと組み合わせて使う。
例えば、xyz[1-4]としたとき、xyz1,xyz2,xyz3,xyz4のいずれか

###正規表現を使う
```Bash:正規表現
grep [オプション] 'パターン (正規表現) 'ファイル名
もしくは
egrep [オプション] 'パターン (正規表現) 'ファイル名
もしくは
fgrep [オプション] 文字列 ファイル名
```

|オプション|機能|
|:---|:---|
|-c|一致した行だけ表示|
|-i|大文字・小文字を区別しない|
|-n|先頭に行番号をつけて一致行を表示|
|-v|パターンに一致しない行を表示|
|-E|egrepと同じ|
|-F|fgrepと同じ|

###sedによる置換
```bash:置換
sed 's/[パターン]/置換文字' ファイル名
```

##プロセスの操作と制御
ジョブは[ls -l | more]で、プロセスは[ls -l][more]となる。
プロセス番号（PID）が自動的に割り当てられ、psコマンドで確認できる。
また、topコマンドでリソース消費量などを確認できる。

#さいごに
linux基礎として、コマンドの基本を学んだ。
次回は管理業務・ファイルシステム管理を学ぶ