LPICレベル1に合格したから、今後も使えそうな知識をまとめてみた

# 概要
先日、だらだらと勉強をしていたLPICのレベル1に合格しました。
Linuxについて、体系的に学べてよかったのですが、正直今後つかわないような範囲も結構ありました。
今回は、LPICレベル1の範囲の中で今後も覚えておくとよさそうなことを独断と偏見で選び、まとめていきます。
LPICの勉強を始めた直後に[こんな記事](https://qiita.com/hsaitoo/items/5424d0c7f741f25bc0f5)も書いているので、良ければ読んでみてください。

尚、筆者はWindowsPCしか持っていないため、Microsoft Storeでダウンロードした[ubuntu](https://www.microsoft.com/ja-jp/p/ubuntu-2004-lts/9n6svws3rx71?activetab=pivot:overviewtab)のアプリを使って操作しています。

# 基本的なコマンド

## pwd
Print Working Directoryの略。現在の作業ディレクトリのパスを表示することができる。
環境変数PWDにも現在の作業ディレクトリのパスが格納されているため、同様の結果を得ることができる。

```bash
$ pwd
/home/testuser
$ echo $PWD
/home/testuser

```

## cd 
Change Directoryの略。引数にパスを渡すことで作業ディレクトリを変えることができる。

```
$ pwd
/home/testuser
$ cd /home
$ pwd
/home
```
`cd`や`cd ~`で実行すると、現在ログイン中のユーザーのホームディレクトリに移動することができる。また、`cd -`で一つ前の作業ディレクトリに移動することができる。

``` bash
$ pwd
/home
$ echo $USER     ## USERはログイン中のユーザー名が格納される環境変数
testuser
$ cd             ## ログイン中のユーザーのホームディレクトリに移動
$ pwd
/home/testuser
$ cd -           ## 一つ前の作業ディレクトリに移動
/home
$ pwd
/home

```
## ls
List Directory Contentsの略。引数にパスを渡すことで、パスないに含まれるファイルやディレクトリを表示することができる。引数を省略すると作業ディレクトリに含まれるファイルやディレクトリを表示することができる

``` bash
root@PC933:/# pwd
/
root@PC933:/# ls
bin  boot  dev  etc  home  init  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  snap  srv  sys  tmp  usr  var
root@PC933:/# ls /var
backups  cache  crash  lib  local  lock  log  mail  opt  run  snap  spool  tmp
```

| オプション| 説明|
| - | - |
| -a | 「.」から始まるファイルも表示する|
| -d | ディレクトリ自身の情報を表示する|
| -l | ファイルの詳細な情報を表示する|

メタキャラクタを使うことで、任意の文字列をパス名に含むもののみを表示することもできる。

``` bash
root@PC933:~/test# ls -l
total 0
-rw-r--r-- 1 root root 0 Apr  4 21:54 file.txt
-rw-r--r-- 1 root root 0 Apr  4 21:55 file1.txt
-rw-r--r-- 1 root root 0 Apr  4 21:55 log1.txt
-rw-r--r-- 1 root root 0 Apr  4 21:55 log2.txt
root@PC933:~/test# ls -l log*
-rw-r--r-- 1 root root 0 Apr  4 21:55 log1.txt
-rw-r--r-- 1 root root 0 Apr  4 21:55 log2.txt

```
## mv
Move Filesの略。ファイル（ディレクトリ）の移動とファイル（ディレクトリ）のリネームを行うことができる。

``` bash
root@PC933:~/test# ls -l
total 0
-rw-r--r-- 1 root root    0 Apr  4 21:54 file.txt
drwxr-xr-x 1 root root 4096 Apr  4 23:03 testdir
root@PC933:~/test# mv file.txt testdir/ ## file.txtをtestdirディレクトリに移動
root@PC933:~/test# ls
testdir
root@PC933:~/test# ls -l testdir/
total 0
-rw-r--r-- 1 root root 0 Apr  4 21:54 file.txt
-rw-r--r-- 1 root root 0 Apr  4 21:54 file.txt
root@PC933:~/test# ls
testdir
root@PC933:~/test# mv testdir/file.txt  testdir/file.rename.txt ## file.rename.txtにリネーム
root@PC933:~/test# ls -l testdir/
total 0
-rw-r--r-- 1 root root 0 Apr  4 21:54 file.rename.txt
```

## rm
Remove files or directoriesの略。fileやディレクトリの削除を行える。

|オプション|説明|
|-|-|
|-f|確認なしに削除を行う|
|-i|削除前に確認を行う|
|-r|ディレクトリ全体を削除する|

## touch
本来はファイルのタイムスタンプを変更するコマンドだが、ファイルの作成のために使われることが多い。

``` bash
root@PC933:~/test# ls -l
total 0
root@PC933:~/test# touch test
root@PC933:~/test# ls -l
total 0
-rw-r--r-- 1 root root 0 Apr  4 23:11 test
```

## tee
標準入力から受け取った内容をファイルに保存しつつ、同様の内容を画面に表示するコマンド。

``` bash
root@PC933:~/test# date | tee date.log
Sun Apr  4 23:14:59 JST 2021
root@PC933:~/test# ls -l date.log
-rw-r--r-- 1 root root 29 Apr  4 23:14 date.log
root@PC933:~/test# cat date.log
Sun Apr  4 23:14:59 JST 2021
```

# ログ解析で使えそうなコマンド
## cat
ファイルの内容を標準出力に出力するコマンド。

|オプション|説明
|-|-|
|-n|行番号を表示する|
|-b|空行を除き、行番号を表示する|

## less
テキストを1画面ずつ表示するコマンド。
分量が大きく、catで表示すると見切れてしまうファイルの内容を確認するときなどに使われる。

表示中の操作

|キー|説明|
|-|-|
|space|次ページへ進む|
|b|前ページへ戻る|
|/<検索文字列>|後に検索をかける|
|?<検索文字列>|前に検索をかける|
|n|検索中に次候補に飛ぶ|
|N|検索中に前候補に飛ぶ|

同様の機能を持つコマンドにmoreコマンドがあり、Windows PowerShellでも利用できる。

## tail
ファイルの末尾を表示するコマンド。
-fオプションと合わせて使われることが多い。

|オプション|説明|
|-|-|
|-n 行数| 末尾から指定された行数のみ表示する（デフォルトでは10行表示|
| -f |末尾に追加された行を表示し続ける|

## cut
ファイルの各行から指定したフィールドを表示する。

|オプション|説明|
|-|-|
|-d <区切り文字>| フィールドの区切り文字をしているする（デフォルトではタブ）|
|-f <取り出すフィールド>|何番目のフィールドを表示するか指定する|

```bash
root@PC933:~# cat test.log
20210405:INFO......
20210406:INFO......
20210407:INFO......

root@PC933:~# cut -d : -f 2 test.log ## 「：」を区切り文字に2番目のフィールドを表示
INFO......
INFO......
INFO......
```

## sort
行単位でファイルの内容をソートするコマンド。

|オプション|説明|
|-|-|
|-r|降順でソートする（デフォルトは昇順）|
|-b|行頭の空白を無視|
|-f|大文字小文字を区別しない|
|-n|数値として処理する(12を1ではなく12で処理する)|
|-t| 区切り文字指定|
|-k| ソートに何番目のフィールドを使うかを指定する|

``` bash

root@PC933:~# cat test.log
20210405:INFO...... :11
 20210406:INFO...... :33
20210407:INFO...... :22

root@PC933:~# sort -b -r -n -t : -k 3 test.log
 20210406:INFO...... :33
20210407:INFO...... :22
20210405:INFO...... :11
```

## tr
標準入力から読み込んだ内容を変換、削除するコマンド。

``` bash 
root@PC933:~# cat tr.txt
Hello World
root@PC933:~# tr 'a-z' 'A-Z' <tr.txt ## 小文字を大文字に変換する
HELLO WORLD

```
|オプション|説明|
|-|-|
|-d|引数に渡した文字列にマッチした文字列を削除する|
|-s|連続する文字列を1文字として処理する|

trコマンドの引数には文字クラスを渡すことも可能。

|クラス|説明|
|-|-|
|[:alpha:]|英字|
|[:lower:]|小文字|
|[:upper:]|大文字|
|[:digit:]|数字|
|[:alnum:]|英数字|
|[:space:]|スペース|


```bash
root@PC933:~# cat tr.txt
20210405 Hello World
root@PC933:~# tr [:lower:] [:upper:] < tr.txt
20210405 HELLO WORLD
root@PC933:~# tr -d [:digit:] <tr.txt
 Hello World

```

## grep
ファイル内の検索を行うコマンド。
引数で渡した文字列が含まれる行を表示する。

|オプション|説明|
|-|-|
|-i|大文字小文字を区別せず検索する|
|-n|行番号も表示する|
|-v|マッチしない行を表示する|

``` bash
root@PC933:~# cat grep.txt
2021/04/05/ 18:56:1617616576 INFO ......
2021/04/05/ 18:56:1617616578 ERROR......
2021/04/05/ 18:56:1617616579 INFO ......
2021/04/05/ 18:56:1617616579 info ......
2021/04/05/ 18:56:1617616580 error......

root@PC933:~# grep -i -n error grep.txt
2:2021/04/05/ 18:56:1617616578 ERROR......
5:2021/04/05/ 18:56:1617616580 error......
```

# 環境変数
環境変数はexportコマンドを使って、設定することもできるが、bash起動時に自動で設定されるものがいくつかある（設定ファイルに書き込まれたものが設定される）。すべて覚えておく必要は全くないが、いくつか覚えておくと重宝するかも。

|環境変数|説明|
|-|-|
|EDITOR|デフォルトのエディタのパス|
|HOME|ホームディレクトリのパス|
|HOSTNAME|ホスト名|
|LANG|ロケール|
|PATH|コマンドやプログラムを検索するパス|
|USER|現在のユーザー|

PATHを通したいときは下記のようにexportコマンドを叩けば設定できる。

```bash
export PATH=$PATH:<通したいPATH>
```

# Linuxのファイルシステム
Linuxのファイルシステムには何種類かあるが、FHS（Filesystem Hierarchy Standard）として標準化が進んでいる。FHSでは/(ルートディレクトリ）を最上位に位置づけ、その配下にいくつかのディレクトリを配置していく。これもすべてを覚えておく必要はないが、主要なものは頭に入れておくといいと思われる。
よくわからないけど、ある設定ファイルを/etcディレクトリに配置するのと、/etcディレクトリは設定ファイルを配置するディレクトリだから、そこに配置しようとするのでは大きく違う。（と思う。）


|ディレクトリ|説明|
|-|-|
|/bin |基本的なコマンドが配置される。|
|/sbin|rootユーザーのみ実行できる、システム管理必要なコマンドが配置される（shutdown,rebootなど）|
|/etc |設定ファイルなどが配置される。|
|/dev |デバイスファイルが配置される。|
|/lib |共有ライブラリが配置される。|
|/opt |パッケージ管理の仕組み（apt,yumなど）によってインストールされたプログラムが配置される。|
|/root|rootユーザーのホームディレクトリ|
|/home|一般ユーザーごとのホームディレクトリが配置される。|
|/var |ログファイルなどが配置される。|
|/tmp |一時ファイルが配置される。|
（一部割愛）

#ロケール
ロケールとは地域情報のことで、それぞれに対応した環境変数を設定することで、メッセージの出力言語や書式を変化させることができる。例えば、コマンド操作によって出力されるメッセージを変えたい場合はLC_MESSAGESを変更することで出力言語を変えることができる。

|カテゴリ|説明|
|-|-|
|LC_TIME|日付や時刻の書式|
|LC_MESSAGES|メッセージ表示に用いる言語|
|LC_ALL|全てのカテゴリで使われる値|
|LANG|全てのカテゴリで使われるデフォルト値|

LANGを設定すると、各カテゴリのデフォルト値を設定でき、ここのカテゴリを設定していた場合はその値で上書きできる。一方で、LC_ALLを設定すると全てのカテゴリにその値が適用される。
（例）
LANG=ja_JP.utf8, LC_MESSAGESが空のとき、メッセージは日本語
LANG=ja_JP.utf8,LC_MESSAGES=en_US.utf8のとき、メッセージは英語
LC_ALL=jp_JP.utf8,LC_MESSAGES=en_US.utf8のとき、メッセージは日本語


# クーロン
cronとは定期的にジョブを実行するための仕組みであり、スケジュール管理を行うcrondとcrontabコマンドで構成される。ユーザー毎に作成されるジョブが書かれたファイルとシステム全体のジョブが書かれたファイルの2種類がある。

||ファイル|編集方法|
|-|-|-|
|ユーザー毎|/var/spool/cront/<ユーザー名>|cronttab -e　コマンドで編集|
|システム|/etc/cron.*/配下のファイル|viコマンドで編集|

crontabコマンド

|オプション|説明|
|-|-|
|-e |crontabファイルを編集する |
|-l |crontabファイルの内容を表示する|
|-r |crontabファイルを削除する|
|-i |crontabファイルを削除する（削除前に確認を行う）|
|-u <ユーザー名>|指定したユーザーのcrontabファイルを編集する(rootのみ実行可）|

crontabファイルの例

```bash
# m h  dom mon dow   command
# 分　時　日　月　曜日　コマンド
  1 *    *  *   *     echo 'per minute' 　　　　　 #毎分実行
  0 0    *  *   *     echo 'every day'            #毎日0:00に実行
  0 9,18 *  *   *     echo 'every 9 and 18'       #毎日9時と18時に実行
  0 9-18 *  *   *     echo 'every hourly 9 to 18' #9時-18時の間、毎時実行
  0 */2  *  *   *     echo 'every 2 hours'        #2時間毎に実行
```

#まとめ
LPICは暗記が基本で、あまり役に立たないという話も聞いたりしますが、個人的には勉強しておいて良かったと思っています。何より、コマンド入力に慣れることが出来るのが1,2年目くらいの社員にとっては大きいかと思います。
少ししたらレベル2にも挑戦しようかな。