【備忘録】Linux/Shell　4月3週目　

備忘録として学んだことを書いていきます。
間違いや書きたいことがあれば適宜修正・加筆します。

今週はLinuxの基本事項について学びました。

## Linuxの主要なディレクトリについて

* `/`：ルートディレクトリ

↓　ルートディレクトリの下に重要なディレクトリがたくさん　↓
* `/bin`：コマンドの実行ファイル（最低限必要なもの）を格納
* `/dev`：デバイスファイル（Linux特有の機能で、ハードウェアをファイルとして扱ったもの）を格納
* `/etc`：設定ファイルを格納
* `/home`：ユーザごとに割り当てる個人用ディレクトリなどを格納
* `/sbin`：実行ファイルを格納（管理ユーザ向け）
* `/tmp`：一時的なファイルを格納（定期的に削除される可能性あり）
* `/usr`：各種アプリケーションと付随するファイルを格納
* `/var`：変化するデータを格納（アプリ動作時に作成されたログなど）

## Shellコマンド集
## 忘れないであろうコマンド達
#### cd：ディレクトリ移動
`../`でひとつ前のディレクトリ
`~`でホームディレクトリ（`/home/ユーザ名`）←移動先を指定しなかったときもこれ
#### touch：空ファイルの作成
#### mkdir：空ディレクトリの作成
#### ls：ファイルやディレクトリをリストで表示
#### pwd：今いる場所（カレントディレクトリ）を表示
#### cat：ファイルの内容を標準出力
複数行になる場合は`less`のほうが優秀
#### mv：ファイルやディレクトリの移動・リネーム
#### rm：ファイルやディレクトリの削除
ディレクトリの削除時は`-r`で再帰的に削除する必要がある
#### cp：ファイルやディレクトリのコピー
ディレクトリのコピー時は`-r`で再帰的にコピー
`-p`オプションでタイムスタンプやパーミッションを保持した状態でコピー
#### ps：プロセスの監視
* `-a`：すべてのユーザを表示
* `-u`：詳細な情報を表示
* `-x`：すべてのプロセスを表示
全部合わせて`ps -aux`と書いたりする
#### kill：プロセスやジョブを殺す（本来はシグナルを送信するコマンド）
`kill %<ジョブID>`：ジョブ（ひとまとまりのプロセス）をキルする
`kill <プロセスID>`：プロセスをキルする
#### whoami：自分自身のユーザ名を確認
#### sudo：super userとして実行
#### man：コマンドのマニュアルを表示
`man -k xxxx`で特定のワード`xxxx`に引っかかったコマンドを検索できる！


## 忘れそうなコマンド達
#### awk：文字列を受け取り、列に対して何らかの処理をする
~~~ shell
# aaa.txt内の文字列をカンマ区切りで列に分けて、その1列目($1)だけ表示
awk -F',' '{print $1}' aaa.txt
~~~
[awkの参考リンク](https://qiita.com/yamazon/items/563af1b485ff413d381f)

#### grep：入力の中で指定された文字列に一致する行を出力
~~~ shell
# bananaが含まれる行だけが出力される
grep 'banana' aaa.txt
~~~
パイプライン`|`で使用することが多い
~~~ shell
# ps -aux の結果のうち、tanaka が含まれる行だけ出力
ps -aux | grep tanaka
~~~
[grepの参考リンク](https://eng-entrance.com/linux-command-grep)

#### sed：指定したファイルをコマンドに従って処理して標準出力
##### `s`：ファイルの内容を置換
~~~ shell
# aabb.txtのaaaの部分をbbbに置換する
# 最後のgは「同じ行に複数回出現した場合、すべて置換」を意味する
sed 's/aaa/bbb/g' aabb.txt
~~~
パイプライン`|`の例
~~~ shell
# ㎰の出力のうちrootをROOTに置換する（1行につき1つだけ置換）
ps -aux | sed 's/root/ROOT/'
~~~

その他機能[sedの参考リンク](https://atmarkit.itmedia.co.jp/ait/articles/1610/17/news015.html)

#### cut：各行から指定した部分だけを切り出す
`-c`：文字数で指定
~~~ shell
# 3文字目から10文字目を取り出す
cut -c 3-10 file.txt
# 3文字目から末尾までを取り出す
cut -c 3- file.txt
~~~
`-b`：バイト数で指定
~~~ shell
# 4バイト目から末尾までを取り出す
cut -b 4- file
~~~

#### head / tail：先頭／末尾から指定した行数だけ取得
~~~ shell
# -nで行数指定
head -n 5 file.txt
# デフォルトでは10行出力
head file.txt
~~~
`tail`と組み合わせて、好きな範囲の行を取り出せる
~~~ shell
# 7行目から10行目までを取り出す
head -n 10 file.txt | tail -n 3
~~~

#### find：ファイルやディレクトリを検索
~~~ shell
find text.txt
~~~
その他機能：[findの参考リンク](https://eng-entrance.com/linux-command-find)

#### fg / bg：ジョブをフォアグラウンド(fg)　／　バックグラウンド(bg)で動かす
~~~ shell
fg %<ジョブID>
bg %<ジョブID>
~~~
[fg / bgの参考リンク](https://www.infraeye.com/study/linuxz17.html)

#### uniq：重複している行を取り除く
~~~ shell
# file.txtから重複している行を取り除いた結果を出力
uniq file.txt
# ソートして重複行を取り除く
sort file.txt | uniq
~~~

#### crontab：cronを設定
`crontab -e`でcronの設定ファイルを編集
cron（クロン）は定期的にコマンドを実行してくれるデーモンプロセスというやつ
##### クロン設定ファイルの書き方
`分 時 日 月 年 <コマンド>`の順に、実行時間と実行コマンドを書く（`*`を使って省略も可能）
例：毎月11日の22時33分にHelloと出力
~~~ shell
33 22 11 * * echo Hello
~~~

`/`を使うと間隔を指定可能
例：5分おきにpingを実行
~~~ shell
/5 * * * * ping -c 1 10.10.10.10
~~~

#### sort：ファイルの内容を並び替える
文字とみなして辞書順に並び替える
`-r`：逆順に並び替える
`-n`：数字とみなして並び替える

::: note warn
`-n`をつけないと辞書順なので、数字は「1→100→11」などの順番になってしまう
:::
#### less：スクロールできる形でファイルの内容を表示
スクロール表示中のコマンド
* `Space` / `f`：1画面下
* `b`：1画面上
* `j`：1行下
* `k`：1行上
* `q`：終了
* `/ 文字列`：下方向に文字列を検索
* `? 文字列`；上方向に文字列を検索
* n：検索中に使える。次の検索結果へ
* N：検索中に使える。前の検索結果へ

::: note warn
標準出力に返していないので、パイプライン`|`で使えない
:::

#### ln：リンクを貼る
デフォルトでハードリンクを貼る
`-s`でシンボリックリンクを貼る

:::note warn
ハードリンクは実態に別の名前を付けてるイメージで、元ファイルを削除しても消えない。
シンボリックリンクはリンク先のパスで実体を参照するので、元ファイルがなくなると壊れる。
:::