Linuxコマンド一覧表

<h2>はじめに</h2>
Linuxで使うコマンドやショートカットキーについてまとめました。
Webエンジニアとして実務に携わっているとLinuxの重要性に気づかされます。

初心者向けに分かりやすくを意識して書いています。


<h2>コマンド入力を楽にするショートカットキー</h2>
ショートカットキーを覚えておくと手入力の手間を省け、作業効率アップにも繋がります。

以下に主に使うショートカットキーの一覧をまとめています。

|ショートカットキー|説明|
|---|---|
|Tabキー|コマンドやパスの保管をする|
|Ctrl+A|行の先頭にカーソル移動  |
|Ctrl+E|行の最後にカーソル移動|
|Ctrl+F|1文字右方向へ移動（矢印キー→と同じ）  |
|Ctrl+B|1文字左方向へ移動（矢印キー←と同じ）  |
|Ctrl+H|カーソルの左を１文字削除する|
|Ctrl+D|カーソル部分を１文字削除する|
|Ctrl+W|カーソル位置の単語を削除（カーソルの前部分(単語の途中で押すとその前半部分だけ削除される)|
|Ctrl+U|カーソルの位置から行頭まで削除|
|Ctrl+K|カーソルの位置から行末まで削除|
|Ctrl+Y|直前に削除した文字列を貼り付け|
|Ctrl+C|実行中のコマンドを強制終了|
|Ctrl+L|画面をクリアにする|
|Ctrl+S|コマンド入力ができないように画面をロック|
|Ctrl+Q|コマンド入力ができるように画面のロックを解除|
|↑, ↓, Ctrl+R|コマンド履歴の参照|

<h2>Linuxコマンドについて</h2>

<h2>基本コマンド</h2>

|Linuxコマンド|説明|オプション|
|---|---|---|
|ls|ファイルやディレクトリの一覧を表示する|-a：隠しファイルも含めてすべて表示<br> -t：最終更新時間によってソートをして表示する<br> -l：ファイルの詳細情報を表示する<br> -r：逆順にソートをして表示する<br> -F：ファイルを種別して表示する|
|pwd|今いるディレクトリをを確認する際に使用する||
|cd|カレントディレクトリの移動・変更||
|mkdir|フォルダを作成する|-p：必要に応じて親ディレクトリも作成|
|rmdir|空のディレクトリを削除する|-p：指定した階層までのディレクトリを一括で削除する。ただし空の場合のみ|
|touch|空のファイルを作成する|-t：[[CC]YY]MMDDhhmm[.ss]形式で指定した日時に変更|
|mv|ファイルの移動、ファイル名の変更を行う|-i：ファイルを上書きする前に確認する<br>-f：強制的に処理を実行する|
|rm|ファイル・ディレクトリを削除する|-r： ディレクトリの中のファイルやディレクトリをまとめて削除する<br>-i：ファイルを削除する前に一度確認する<br>-f：強制的に処理を実行する|
|cp|ファイルをコピーする|-i：コピーする前に確認する<br>-r：ディレクトリをコピーする<br>-p:ファイルの所有者・属性・更新日時などの情報を保持したまま元ファイルの情報を保存する|
|cat|ファイルの中身を表示する|-n：行番号を追加して表示する|
|less|長いファイルの中身をスクロール表示する||
|more|ファイルをページ単位で表示する||
|tail|テキストファイルまたはパイプでのテキスト入力の最後のn行を抜き出す|-n：末尾から指定した行を表示する|
|find|ファイルを検索する|-name：ファイル名を指定して検索<br>-typeタイプ：（d: ディレクトリ、f: ファイル、l: シンボリックリンク）<br>|
|ln|リンクを張る(別名をつける)|-s：シンボルリンクを作成する(オプションを付けないとハードリンクになる)|
|grep|指定した文字列がテキスト内に存在した場合その行を抽出する|-e：文字列を検索パターンとして扱う<br>-i：検索パターンと入力ファイルの双方で英大文字と小文字の区別を行わない<br>-v：検索パターンとマッチしなかった行を選択する|
|chmod|ファイルやフォルダのアクセス権限を変更する|-R：ディレクトリ内の複数のファイルも変更対象とする|
|chown|ファイルやフォルダのオーナーやグループを変更する|-R：ディレクトリ内の複数のファイルも変更対象とする|
|sudo|スーパーユーザーで権限を実行する|-u：指定したユーザーでコマンドを実行する|
|diff|ファイルとファイルの内容の違いを表示する||
|history|コマンドの履歴を表示する||
|kill|ジョブやプロセスを終了させるコマンド||
|ps|実行中のプロセスを表示するコマンド|-A：全プロセスを表示する<br>-e：実行しているコマンド名と環境変数を表示する<br>-l：プロセスの状態なども表示する<br>|
|man|コマンドのマニュアルを表示する||
|scp|リモートマシンとローカルマシン、あるいはリモートマシン同士でファイルをコピーする際に使用するLinuxのコマンド|-i：ssh接続に使用する鍵ファイルを指定する<br>-p：コピー元のタイムスタンプやパーミッションを保持する<br>-r：ディレクトリごと再帰的にコピーする<br>|


<h3>lsコマンド</h3>

```
# ls [オプション][ファイル]

# ls: 現在のフォルダにあるファイルやディレクトリを表示
$ ls

test1 test1.txt test2.txt

# ls -al: aとlを組み合わせることで隠しファイルとファイルの詳細情報を両方表示する。
$ la -la
 
total 0
drwxr-xr-x   5 user  staff   160 11 27 23:30 .
drwxr-xr-x+ 94 user  staff  3008 11 25 22:43 ..
drwxr-x--x   3 user  staff    96 11 25 21:55 test1
-rw-r--r--   1 user  staff     0 11 27 23:28 text1.txt
-rw-r--r--   1 user  staff     0 11 27 23:28 text2.txt

# ls *.txt: 拡張子がtxtのファイルの一覧を表示する
$ ls *.txt

text1.txt	text2.txt

# ls ???.txt txtで終わり、5文字で始まるファイルを表示する
$ ls ?????.txt
```

<h3>pwdコマンド</h3>

```
# 現在どの位置にディレクトリがいるかを表示する
$ pwd
#/Users/ユーザー名/work
```

<h3>mkdirコマンド</h3>

```
# mkdir ディレクトリ名

# test1ディレクトリの作成を行う
$ mkdir test1

# 指定されたディレクトリの上位ディレクトリも作成する
# test2/test1/test3ディレクトリの作成を行う
$ mkdir -p test2/test1/test3 
```

<h3>rmdirコマンド</h3>

```
# rmdir ディレクトリ名
# 空であるtest1ディレクトリを削除する
$ rmdir test1

# 空であるtest2/test1/test3ディレクトリを一括で削除する
$ rmdir -p $ rmdir -p test2/test1/test3
```

<h3>touchコマンド</h3>

```
# touch オプション ファイル名
# test1.txtの作成を行う
$ touch test1.txt
```

<h3>mvコマンド</h3>

```
# mv 移動元ファイル(移動元ディレクトリ) 移動先ファイル(移動先ディレクトリ)

# ディレクトリを別ディレクトリに移動する
# test1の中にtestディレクトリが移動する
$ mv test test1

# ファイルを別のディレクトリに移動する
# text2.txtがtest1ディレクトリに移動する
$ mv text2.txt test1

# ファイル名の変更
# text1.txtがファイル名でtext5.txtが存在しない場合、ファイル名がtext5.txtに変更される
$ mv text1.txt text5.txt

# ディレクトリ名の変更
# test3が存在しない場合ディレクトリ名がtest1からtest3に変更される
$ mv test1 test3
```

<h3>rmコマンド</h3>

```
# rm [オプション] ファイル名 

#text2.txtを削除する
$ rm text2.txt

#test3ディレクトリとtest3ディレクトリの中の、ファイルやディレクトリも削除される
$ rm -r test3
```

<h3>cpコマンド</h3>

```
# cp [オプション] コピー元 コピー先

# cp ファイルをコピーする
$ cp text1.txt text3.txt

# lsで確認するとtext1.txtをコピーしたtext3.txtが作成される
text1.txt	text2.txt	text3.txt

# ディレクトリをコピーする
$ mkdir test
$ cp -r test test1

test		text1.txt	text3.txt
test1		text2.txt
```

<h3>catコマンド</h3>

```
# cat [オプション] ファイル名

# text3.txtの中身を表示する
$ cat text3.txt

# 行番号付与してtext3.txtの中身を表示する
$ cat -n text3.txt

 1	aaaaa
 2	aass
 3	ssss
 4	ssss

```

<h3>moreコマンド</h3>

```
# more ファイル名

# 行数が多い場合に、ページャを使って画面に表示する
$ more docker-compose.yml

# スペース: 次のページに進む
# b: 前の一画面に戻る
# f: 次の一画面に進む
# /単語: 単語を検索する。nキーで検索結果へジャンプする。
# q: ページャコマンドを終了する
```

<h3>lessコマンド</h3>

```
# less ファイル名

# 行数が多い場合に、ページャを使って画面に表示する
$ more docker-compose.yml

# スペース: 次のページに進む
# b: 前の一画面に戻る
# f: 次の一画面に進む
# ↑: 前の次に進む
# ↓: 次の次に進む
# /単語: 単語を検索する。nキーで検索結果へジャンプする。
# q: ページャコマンドを終了する
```

<h3>tailコマンド</h3>

```
# tail オプション ファイル名

# text3.txtファイルの末尾10行を表示する
$ tail text3.txt
```

<h3>findコマンド</h3>

```
# find パス -name ファイル名

# /Users/ユーザ名/work にあるtext3.txtを探す。
$ find /Users/ユーザ名/work -name text3.txt

# ディレクトリを検索する場合
# /Users/ユーザ名/work にあるディレクトリを探す。
$ find /Users/ユーザ名/work -type d

# ファイルを検索する場合
# /Users/ユーザ名/work にあるファイルを探す。
$ find /Users/ユーザ名/work -type f
```

<h3>chmodコマンド</h3>

```
# ファイルのアクセス権を変更する。
$ chmod モード[,モード] ファイルまたはディレクトリ
$ chmod 8進数表記のモード ファイルまたはディレクトリ

# test1ディレクトリに書き込み権限を追加
$ chmod g+w test1

# test1ディレクトリ内のユーザから読み込み権限を除去して、書き込み権限を追加
$ chmod u-r,o+w test1
```

<h3>chownコマンド</h3>

```
# ファイルの所有者を変更する。ルートとグループを変更するには、rootユーザである必要がある。
$ chown ユーザ[.グループ] ファイルまたはディレクトリ

# text3.txtの所有者をuser3に変更する
$ chown user3 text3.txt

# test1ディレクトリ内の所有者をuser4に変更する
$ chown -R user4 test1
```

<h3>grepコマンド</h3>

grepコマンドの正規表現

|記号|説明|
|---|---|
|^|行頭を表す。|
|$|行末を表す。|
|.|任意の一字を表す。|
|*|直前文字の0回以上の繰り返しを表す。|
|[...]|...の中の任意の1字を表す。|
|[^...]|...の中の文字が含まれないことを表す。|
|¥|正規表現の記号をエスケープする。|
|b$|bで終わる行。|
|a.b|aとbの間に1文字入っている。|
|[ab]ab|aもしくはbに続く(aab, bab)|
|[^ab]ab|aもしくはbで始まらないでabが続くもの(xab,zab等)|

```
# grep [オプション] 検索条件 [指定ファイル]

# text3.txtの中にある「aaa」を検索する
$ grep aaa text3.txt
```

<h3>sudoコマンド</h3>

```
# スーパーユーザ(root)権限でコマンドを実行する
# sudo cat 

# text3.txtの中身をrootユーザでみる
$ sudo cat text3.txt

# text3.txtの中身をuser1でみる
$ sudo -u user1 cat text3.txt
```


<h3>diffコマンド</h3>

```
# diff オプション ファイル名 ファイル名

# text3.txtとtext4.txt ファイルの差分を表示する
$ diff text3.txt text4.txt 
```

<h3>manコマンド</h3>

```
# man コマンド名

#lsコマンドのマニュアルを表示する
$ man ls
```

<h3>scpコマンド</h3>

```
# リモートマシンとローカルマシン、あるいはリモートマシン同士でファイルをコピーする際に使用する
# scp [オプション] コピー元パス 保存先パス

#リモートのファイル(test.txt)をローカルのカレントディレクトリへコピー
$ scp user@xxx.xxx.xxx.xxx:~/test.txt ./

#ローカルのカレントディレクトリのファイル(test.txt)をリモートのホームディレクトリ直下へコピー
$ scp test.txt user@xxx.xxx.xxx.xxx:~/
```

<h2>正規表現とパイプについて</h2>
今までは、さまざまなコマンドを利用してきましたが、Linuxには「1つの入り口と２つの出入り口があります。

![スクリーンショット 2021-11-28 11.09.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576859/c517583f-7248-7a89-6019-1c6c695ad236.png)

|標準入出力の項目|説明|
|---|---|
|標準入力|プログラムの標準入力でプログラムに入ってくるデータのことを示す。|
|標準出力|プログラムの標準出力を行う。|
|標準エラー出力|プログラムのエラーメッセージを出力する。|

<h3>リダイレクト</h3>
標準出力された文字をファイルに書き込むことができる。

```
#書き込みたいコマンド名 > ファイル名

# lsの出力結果をtest2.txtに書き込む
$ ls > test2.txt
```

<h3>パイプ</h3>
コマンドをつなぐ役割を持っている。

```
# 実行例: /Users/ユーザ名/workの一覧を表示しつつ、lessコマンドを実行する
$ ls -l /Users/ユーザ名/work | less
```

<h2>viによる操作方法</h2>
viとはテキストを編集するためのコマンドやソフトのことで、Linuxでファイルを編集したり、中身を確認したりする際によく使われる。

<h4>ファイルを開く場合</h4>

```
# vi ファイル名

# text1.txtファイルを開く
$ vi text1.txt
```

<h4>ファイルを閉じる場合</h4>

```
# :qコマンドを実行する
```

<h4>ファイルの中身を編集して保存する場合</h4>

```
# :wコマンドを実行する
```

<h4>ファイルを保存して終了する場合</h4>

```
# :wqコマンドを実行する
```

<h4>ファイルを保存せずに終了する場合</h4>

```
# :qコマンドの後に!をつけて実行する
:q!
```

<h4>ファイルに内容を書き込みたい場合</h4>

```
# インサートモード(i)を押す
```

<h4>ファイル編集の際に使用できる便利なコマンド表</h4>

|コマンド|内容|
|---|---|
|x|1文字削除|
|dd|1行削除|
|yy|1行コピー|
|nyy|n行コピー|
|p|カーソルの文字の次または次の行にペースト|
|P|カーソルの文字の前または前の行にペースト|
|u|カット、ペーストを一回取り消し|

<h4>ファイル内検索と置換</h4>

|コマンド|内容|
|---|---|
|/検索文字列|文字列の検索|
|n|下方向へ再検索|
|N|上方向へ再検索|
|:対象の行 s/検索文字列/置換文字列/オプション|文字列を置換する|

<h2>ユーザー管理</h2>

|コマンド|説明|
|---|---|
|useradd|新規ユーザの作成|
|usermod|ユーザアカウントの変更|
|userdel|ユーザの削除を行う|
|groupadd|グループの作成|
|groupmod|グループの登録情報の変更|
|groupdel|グループを削除する|
|passwd|ユーザのパスワード登録と変更ユーザのパスワードを登録したり変更したりする|
|su|一時的に他のユーザになるためのコマンド|