【読書メモ】Linux標準教科書（第1章〜第6章）

#はじめに
初学者が何より理解すべき、Linuxについて、『Linux標準教科書（PDF）』を読んだ要約をアウトプットします。今回は前半の第１章〜第６章まで。

#第１章　Linuxとは
・基本ソフトウェア：コンピュータシステム全般を管理するソフトウェア
・応用ソフトウェア：特定の目的に応じて開発されたソフトウェアの総称（表計算ソフト、ワープロソフトなど）
・広義のLinux＝[ハードウェア]+[カーネル]+[応用ソフトウェア]
・狭義のLinux＝[カーネル]
・カーネル：OSの中核で、ハードウェアと直接やりとりする機能を持つ部分
・ユーザランド：OSが動作するのに必要なカーネル以外の部分
・シェル（殻）：対話型のコマンド入力環境。入力されたコマンドを理解→実行
・応用ソフトウェア導入には、複数の応用ソフトウェアや、動作を補足するライブラリが必要な場合がある。依存するプログラムがさらに別のプログラムに依存しているとなると、**正しい場所に正しい順序でインストール**しないといけない。


#第２章　Linuxのインストール
macOSでデフォルトでインストールされているので、省略


#第3章　基本的なコマンド
・目的に応じた基本コマンドとオプションの紹介
※実際のコマンドは他Qiitaでたくさん出るため、オプション中心に紹介

###一覧の確認
```
ls [オプション] [ファイル名]：一覧取得
-a:.で始まる隠しファイルも全て（All）出力
-l:長（Long）形式で出力
-t:最終更新時間（Time)でソートして出力
-r:逆順（Reverse）にソートして出力
# ソートとは、一定の基準で並べ替えること
```
・lsコマンドの結果からさらに絞り込む場合、ワイルドカード（＝全てのパターンにマッチする文字列）を使用可能。例えば、.etcディレクトリ内の「conf」ファイルを絞り込んで表示させるにはこのように記述
・なお、文字数が明確である場合、「？」を使用

```
$ cd /etc
$ ls *.conf
Trolltech.conf
ntp.conf
（※あくまで一例です）
$ ls hosts.*
hosts.allow hosts.deny
$ ls hosts.????
hosts.deny
```

###ファイルのコピー

```
cp [オプション]　コピー元　コピー先
-i:処理を行う時に確認をする。コンピュータが確認のための問い合わせをする。誤って上書きコピーされるのを防ぐ目的で使用

-r:ディレクトリをコピー。基本cpはファイルをコピーする機能のみだが、-rをつけるとディレクトリ内の全てのファイル・ディレクトリに対してコピー可能

-p:元ファイルの情報を保存。古い情報を保持したままコピーを作成したい場合につける。
```

###ファイルの移動

```
mv 移動元ファイル　移動先ファイル
-i:処理を行う時に確認をする。コンピュータが確認のための問い合わせをする。誤って移動されるのを防ぐ目的で使用
-f:強制的に実行。一部の処理では、確認の問い合わせがあるが、それを無視して実行するというもの
▶️チーム開発で無闇に処理しないよう注意
```

###ファイルの削除

```
rm ファイル名
-i:確認の問い合わせ
▶️informationの略ですね？
-f:強制実行
-r:ディレクトリ＋ディレクトリ内のファイルやディレクトリを対象に削除
```

###ディレクトリの操作（pwd,cd,mkdir,rmdir）

```
pwd:現在どの位置にいるか表示する（Print Working Directoryの略）
cd [ディレクトリ名]:移動

mkdir [ディレクトリ名]:作成
オプション
-p:指定されたディレクトリの上位ディレクトリも作成
$ mkdir dir1/dir2/dir3

rmdir [ディレクトリ名]:削除
-p:指定された階層までのディレクトリを一括削除
（オプション付けなかった場合、最下層のディレクトリのみ削除）
**※対象とするディレクトリ内は空でないといけない**
$ rmdir directory/
rmdir: failed to remove 'directory/': ディレクトリは空ではありません
$ rmdir -r directory/
（rm -rを実行）で削除可能
```
###特別なディレクトリ

| 名称 | 機能 |
|:-:|:-:|
|カレントディレクトリ（.）|現在いるディレクトリ|
|親ディレクトリ（..）|1階層上のディレクトリ|
|ホームディレクトリ （~）|ユーザの作業開始位置となるディレクトリ|
|ルートディレクトリ（/）|ディレクトリ階層の最上位階層|

###絶対（パス）指定と相対（パス）指定

カレントディレクトリが/usr/localであるとする、この時、/usr/bin/xxxのファイルを指定するには2通りの方法がある。

1. /usr/bin/xxx
2. ../bin/xxx

1.は最上位のディレクトリ（/）からディレクトリ・ファイル名を指定している。この方法を絶対（パス）指定という
2.は「自分がいる位置から見て」指定。この方法を相対（パス）指定という

###ファイルの内容を表示（cat）

```
cat [ファイル名]
-n:行番号を付加して表示
```

###ページャを使った表示
catコマンドでファイルの中身を表示する際、行数がたくさんあると表示が流れてしまう。たくさんの行があっても画面制御を行いスクロールを途中で止めてくれる機能をページングといい、それを表現するのをページャという。

```
more [ファイル名]
less [ファイル名]
```
できることかなり多いのと、実務ではless多めならしいので参考記事のみ紹介。
[参考記事：Linux コマンド２ (cat,grep)](https://qiita.com/HirotakaM/items/5ea350b3444af8aee5db)

###その他知った方が良さそうなこと

```
find パス -name [ファイル名]：ファイルの検索
man [cpやlsなど]：[]内のコマンドに対するマニュアルを表示する
```


#第4章　正規表現とパイプ
・標準入出力：Linuxのプログラム（＝コマンド）には、「1つの入り口と2つの出口」がある・。それぞれ標準入力、標準出力・標準エラー出力という。特にコマンドを実行した結果が画面上に表示されることを「標準出力に出力された」と表現する。

###ファイルの中からデータを検索(grep)

```
grep [オプション名]　検索条件 [指定ファイル]
オプション
-e:文字列を検索パターンとして扱う
-i:検索パターンと入力ファイルの双方で、英大文字と小文字の区別をしない
-v:検索パターンとマッチしなかった行を選択する
```
|記号|意味|
|:-:|:-:|
|^|行頭を表す|
|$|行末を表す|
|.|任意の一字を意味する|
|*|直前文字の0回以上の繰り返し処理を意味する|
|[...] |..のなかの任意の一字を意味する|
|[^...]|..の文字が含まれないことを意味する|
|¥|正規表現の記号をエスケープする|


#第5章　基本的なコマンド2（テキストファイルの処理で便利）

###ファイルのタイムスタンプの変更（touch）＆ファイルの作成
・タイムスタンプ：ある時刻にその電子データが存在していたことと、それ以降改ざんされていないことを証明する技術。タイムスタンプに記載されている情報とオリジナルの電子データから得られる情報を比較することで、タイムスタンプの付された時刻から改ざんされていないことを確実かつ簡単に確認できる。

```
$ ls -l
total 8
-rw-r--r--  1 user  staff  81  8 10 23:01 dockerfile
$ touch -t dockerfile
usage:touch [-A [-][[hh]mm]SS] [-acfhm] [-r file] [-t [[CC]YY]MMDDhhmm[.SS]] file ...
#　-tオプションつけて、日付、時間、対象ファイルの順番でコマンド打ってね
$ touch -t 08142033 dockerfile 
$ ls -t
dockerfile
$ ls -l
total 8
-rw-r--r--  1 user  staff  81  8 14  2020 dockerfile
$ touch test.md
# 新規ファイルが作成される
$ ls
dockerfile	test.md
```
###ファイルの一部を取得（head,tail）

```
head [オプション名]　ファイル名
tail [オプション名]　ファイル名
-n(行):先頭から指定した行を標準出力
-c(バイト):先頭から指定したバイト分を標準出力
```

###テキストファイルのソート（sort）

```
sort [オプション] ファイル名
オプション名
-r:逆順でソートする
-k n:n列目のデータをソートする
-n:数値としてソートする

```
###ファイルの比較（diff）

```
diff [オプション] ファイル1　ファイル2
オプション
-c:context diff形式で差分を出力
-u:unified diff形式で差分を出力
```

#第6章　vi エディタ
・vi:ページャであり、エディタでもある。ファイルの開閉とファイルの保存と終了その他操作可能。

|コマンド|処理内容|
|:-:|:-:|
|vi [ファイル名]|ファイルを開く|
|:q|ファイルを閉じる|
|ESC+:w|変更内容が書き込まれる|
|ESC+:wq|変更内容の書き込み＋保存して終了|
|ESC+:q!|保存せず強制終了|

イメージ

```
$ vi test.rb
ken ryu 80
keiko oka 40
hajime chan 100
~
~
```
###インサートモードとコマンドモード
・viエディタを起動すると、コマンド入力するコマンドモードでファイルが開かれる。**文字列を打ち込むには、iコマンドもしくはaコマンドなどでインサートモードに切り替える**必要がある。

###カーソル移動
``行番号``　指定した行番号へ移動
``G``　ファイルの末尾
``h``　左へ1文字
``j``　下へ1文字
``k``　上へ1文字
``l``　右へ1文字
``w``　次の単語へ
``0``　行の先頭
``$``　行の末尾

###文字のカット・アンド・ペースト
``x``　1文字削除
``dd``　１行削除
``yy``　１行コピー
``nyy``　n行コピー
``p``　カーソルの文字の次または次の行にペースト
``P``　カーソルの文字の前または前の行にペースト
``u``　カット、ペーストを1回取り消し

###置換と検索
``/検索文字列``　文字列の検索
``n``　下方向へ再検索
``N``　上方向へ再検索
``：対象の行 s/検索文字列/置換文字列/オプション``　文字列を置換する

###文字列の置換
``:ns/old/new``　n行目の最初のoldをnewに置換して終了
``:ns/old/new/g``　n行目の全てのoldをnewに置換して終了
``:%/old/new/g``　ファイル全体の検索語句を置換
``:%/old/new/gc``　置換の度に確認を求める




#参考資料
[Linux標準教科書](https://linuc.org/textbooks/linux/)
[ブクマ必至！Linuxコマンド一覧表【全33種】
](https://www.sejuku.net/blog/5465)[viコマンド](https://qiita.com/may-bee-39/items/2164819b2e27f512eefe#%E3%82%AB%E3%83%BC%E3%82%BD%E3%83%AB%E7%A7%BB%E5%8B%95)
[なぜ、IDEじゃなくてVimを使うか。](https://qiita.com/rbtnn/items/88dcbe60d49db6de8002)