Linuxコマンド・シェル系チートシート

# linuxコマンド
## `history`コマンド
コマンド履歴を表示

* `!文字列`：実行したコマンドの中で、指定した文字列から始まるコマンドを実行する
* `!?文字列`：実行したコマンドの中で、指定した文字列を含むコマンドを実行する
* `!!`：直前に実行したコマンドを再実行する
* `!履歴番号`：履歴番号のコマンドを実行する

## `grep`コマンド
* `-r`オプション：ディレクトリ内を再帰的に検索
* `-i`オプション：大文字小文字の区別をせず検索
*  `-n`オプション：検索結果と合わせて行番号も表示
*  `-l`オプション：パターンと一致するファイル名を表示
*  `-v`オプション：パターンがマッチしない行を表示

※`-E`オプションもしくは`egrep`コマンドで拡張正規表現が使える。正規表現使いたくないときは`fgrep`コマンド

## `ls`コマンド
* `-A`オプション：`.`から始まるファイルも表示。カレントディレクトリと親ディレクトリは表示しない
* `-a`オプション：`.`から始まるファイルも表示
* `-d`オプション：ディレクトリ自身の情報を表示
* `-F`オプション：ファイルの種類も表示
* `-t`：日付順に表示

## `cp`コマンド
* `-f`オプション：コピー先に同名ファイルがあれば上書き
* `-i`オプション：コピー先に同名ファイルがあれば上書きするかどうか確認
* `-p`オプション：コピー元のファイル属性（所有者、アクセス権、タイムスタンプ、など）を保持したままコピー
* `-r`オプション：ディレクトリ内を再帰的にコピー
``` shell
cp data.txt data.txt.org
```

## `mv`コマンド
* `-f`オプション：移動先に同名のファイルがあれば上書き
* `-i`オプション：移動先に同名のファイルがあれば上書きするかどうか確認

※同一のディレクトリ内でファイルを移動すると、ファイル名の変更になる

``` shell
#sample.txtファイルをホームディレクトリに移動する
mv sample.txt ~
#ファイル名をoldname.txtからnewname.txtに変更
mv oldname.txt newname.txt
```
## `mkdir`コマンド
* `-m`オプション：指定したアクセス権でディレクトリを作成
* `-p`オプション：必要なら親ディレクトリも同時に作成

## `rm`コマンド
* `-f`オプション：ユーザーへの確認なしに削除
* `-i`オプション：削除する前にユーザーに確認
* `-r`オプション：再帰的にディレクトリ全体を削除

## `rmdir`コマンド
* `-p`オプション：複数の空ディレクトリを削除

※ディレクトリ内にファイルやサブディレクトリが残っている場合は、
* 前もってディレクトリ内のファイルを削除しておく
* `rm -rf`実行で代替する

## `file`コマンド
テキストファイルor実行ファイルorJPEG画像ファイルorディレクトリなどのファイルの種別を表示

## `cat`コマンド
* `-n`オプション：各行の左端に行番号を付加

## `head`コマンド
ファイルの先頭部分を表示<br>
※オプション指定しない場合、先頭から10行目までを表示

* `-n 行数`or`-行数`：先頭から指定された行数分だけ表示

## `tail`コマンド
ファイルの末尾を表示<br>
※デフォルトでは最終行から10行が表示

* `-n 行数`or`-行数`：末尾から指定した行数分だけ表示
* `-f`オプション：ファイルの末尾に追加された行を表示し続ける

## `cut`コマンド
ファイルの各行から指定したフィールドを取り出す。

* `-c 文字数`：取り出す文字位置を指定
* `-d 区切り文字`：フィールドの区切り文字（デミリタ）を指定する※デフォルトはタブ
* `-f フィールド`：取り出すフィールドを指定する

``` shell
#/etc/resolv.confファイルの各行から5文字目を取り出す
cut -c 5 /etc/resolv.conf
#/est/resolv.confファイルの各行から1～7文字目を取り出す
cut -c 1-7 /etc/resolv.conf
#区切り文字を:として、/etc/passwdファイルの各行から第6フィールドだけを取り出す
cut -d: -f 8 /etc/passwd
```

## `paste`コマンド
1つ以上のファイルを読み込んで、行ごとに水平方向に連結。連結するときの区切り文字は、デフォルトではタブ。

* `-d 区切り文字`：区切り文字（デミリタ）を指定する（デフォルトはタブ）

## `tr`コマンド
標準入力あから読み込まれた文字列を変換もしくは削除

### オプション
* `-d`オプション：マッチした文字列を削除
* `-s`オプション：連続するパターン文字列を1文字として処理
### クラス
* [:alpha]：英字
* [:lower:]：英小文字
* [:upper:]：英大文字
* [:digit:]：数字
* [:alnum:]：英数字
* [:space:]：スペース

``` shell
#/ect/hostsファイル中の小文字を全て大文字に変更
cat /etc/hosts | tr 'a-z' 'A-Z'
#以下も同じ
cat /etc/hosts | tr [:lower:][:upper:]
#file1中にある:を削除
tr -d : < file1
```

## `sort`コマンド
行単位でファイルの内容をソート。デフォルトでは昇順にソート。

* `-b`オプション：行頭の空白は無視
* `-f`オプション：大文字小文字の区別を無視
* `-r`オプション：降順にソート
* `-n`オプション：数字を文字ではなく数値として処理

## `split`コマンド
指定されたサイズでファイルを分割。デフォルトでは1000行ごとに複数ファイルに分割。

## `uniq`コマンド
入力されたテキストストリームの中で重複している行を調べて、重複している行は1行にまとめて出力。入力するテキストストリームはソートしておく必要があるので、多くの場合sortコマンドとパイプで組み合わせて使う。

* `-d`オプション：重複している行のみ出力
* `-u`オプション：重複していない行のみ出力

## `wc`コマンド
ファイルの行数、単語数、文字数を表示。

* `-c`オプション：文字数（バイト数）を表示
* `-l`：行数を表示
* `-w`：単語数を表示

## `xargs`コマンド
標準入力から受け取った文字列を引数に指定して、与えられたコマンドを実行。

``` shell
#60日を超える日数の間更新されていないファイルを削除
find . -mtime +60 -type f | xargs rm
#上記は次のコマンドと同じ
find . -mtime +60 -type f -exec rm {} \;
#rmは多数のファイルがあるディレクトリだとシェルの制限を超えてしまうため、以下で
echo * | xargs rm
```

## `find`コマンド
指定したディレクトリ以下から、検索条件にマッチするファイルやディレクトリを検索<br>**※検索ディレクトリの指定を省略した場合はカレントディレクトリが検索対象になる**

* `-name`オプション：ファイル名で検索
* `-atime`オプション：最終アクセス時刻で検索
* `-mtime`オプション：最終更新時刻で検索
* `-perm`オプション：アクセス権で検索
* `-size`オプション：ファイルサイズで検索
* `-type`オプション：ファイルの種類で検索（`f`：ファイル、`l`：シンボリックリンク、`d`：ディレクトリ）
* `-user`オプション：ファイルの所有者で検索
* `-print`オプション：マッチしたファイルを表示
* `-exec`オプション：マッチしたファイルに対してコマンドを実行
* `-ok`オプション：マッチしたファイルに対してコマンドを実行（確認あり）

``` shell
#/homeディレクトリ以下から、ファイル名の末尾が.rpmのファイルを検索
find /home -name "*.rmp"

#/dataディレクトリ以下から過去1日以内に更新されたファイルを検索
find /data -type f -mtime 1

#/usr/binディレクトリ以下から、SUIDが設定されたファイルを検索
find /usr/bin -type f -perm -u+s

#/tmpディレクトリ以下から、所有者がstudentのファイルやディレクトリを検索
find /tmp -user student

#カレントディレクトリ以下から30日を超える日数の間アクセスされていないファイルを検索し、削除
find -atime +30 -exec rm {} \;
```

## `df`コマンド
ファイルシステムの空き容量を確認
* `-h`オプション：容量を適当な単位で表示
* `-H`オプション：容量を適当な単位で表示
* `-k`オプション：容量をKB単位で表示
* `-i`オプション：iノードの使用状況を表示

## `du`コマンド
* `-a`オプション：ディレクトリ以外にファイルについても表示
* `-l`オプション：リンクも含めて表示
* `-c`オプション：すべての容量の合計を表示
* `-k`オプション：容量をKB単位で表示
* `-m`オプション：容量をMB単位で表示
* `-s`オプション：指定したファイルやディレクトリのみの合計を表示
* `-S`オプション：サブディレクトリを含めずに集計
* `-h`オプション：容量を読みやすい単位で表示
``` shell
#カレントディレクトリ内の容量を表示
du
#testdirディレクトリの容量を表示
du -s testdir
#容量の合計を表示
du -c
#ファイルの容量も表示
du -a
```

## `gzip`コマンド
* `-d`オプション：圧縮ファイルを展開
* `-c`オプション：標準出力へ出力
* `-r`オプション：ディレクトリ内のファイルをすべて圧縮

``` shell
#ファイルdatafileを圧縮。圧縮したファイルはdatafile.gzとなり、元ファイルは削除される
gzip datafile
#sampledディレクトリ内にあるすべてのファイルをここに圧縮。ディレクトリ自体を圧縮するわけではない点に注意
gzip -r sampled
#圧縮前のファイルも残しておきたい場合は、-cオプションを使って標準出力へ出力したものをリダイレクトで保存
gzip -c datafile > datafile.gz
```

※圧縮されたファイルをもとに戻す（＝解答する）には、gzipコマンドで圧縮された「~.gz」ファイルの場合は`gunzip`コマンドを使う

## 圧縮ファイルの閲覧
* `zcat`コマンド：gzipコマンドで圧縮されたファイルの内容を出力
* `bzcat`コマンド：bzip2コマンドで圧縮されたファイルの内容を出力
* `xzcat`コマンド：xzコマンドで圧縮されたファイルの内容を出力

## `tar`コマンド
ファイルやディレクトリを1つのアーカイブファイルにまとめたり、それを展開したりする。デフォルトのtarコマンドはファイルを圧縮しないが、zオプションを付けるとgzipを使った圧縮/展開を、jオプションを付けるとbzip2を使った圧縮/展開をサポート。tarコマンドのオプションでは`-`を省略できる。

* `-c`オプション：アーカイブを作成
* `-x`オプション：アーカイブからファイルを取り出す
* `-t`オプション：アーカイブの内容を確認
* `-f`オプション：アーカイブファイル名を指定
* `-z`オプション：gzipによる圧縮/展開
* `-j`オプション：bzip2による圧縮/展開
* `-J`オプション：xzによる圧縮/展開
* `-v`オプション：詳細な情報を表示
* `-u`オプション：アーカイブ鵜内にある同名のファイルより新しいものだけを追加
* `-r`オプション：アーカイブにファイルを追加
* `-N`オプション：指定した日付より新しいデータのみを対象とする
* `-M`オプション：複数デバイスへの分割
* `--delete`オプション：アーカイブからファイルを削除

``` shell
#/homeのアーカイブをSCSI接続されたテープドライブ（/dev/st0）に作成
tar cvf /dev/st0 /home
#アーカイブファイルsoftware.tar.gzをカレントディレクトリ上に展開
tar xvzf software.tar.gz
#/dev/sdb1にあるアーカイブの内容を表示
tar ft /dev/sdb1
#/dev/sdb1にバックアップされた/varディレクトリの中から/var/log/secureファイルを取り出す。/varディレクトリの最初の/は指定しなくてよい
tar xvf /dev/sdb1 var/log/secure
```

## `cpio`コマンド
ファイルをアーカイブファイルにコピーしたり、アーカイブからファイルをコピー

* 主なフラグ
  * `-i オプション パターン`：アーカイブからファイルを抽出
  * `-o オプション`：アーカイブを作成
  * `-p オプション ディレクトリ`：ファイルを別のディレクトリにコピー

* 主なオプション
  * `-A`オプション：既存のアーカイブにファイルを追加
  * `-d`オプション：必要ならディレクトリを作成
  * `-r`オプション：ファイル名を対話的に変更
  * `-t`オプション：コピーはせず、入力された内容を一覧表示
  * `-v`オプション：ファイル名の一覧を表示

``` shell
#カレントディレクトリ以下を/tmp/backupファイルとしてバックアップ
ls | cpio -o > /tmp/backup
```

## `dd`コマンド
入力側に指定したファイルからの入力をファイルもしくは標準出力に送る

* `if=入力ファイル`：入力側ファイルを指定（デフォルトは標準入力）
* `of=主力ファイル`：主力側ファイルを指定（デフォルトは標準主力）
* `bs=バイト数`：入出力のブロックサイズを指定
* `count=回数`：回数分の入力ブロックをコピー

``` shell
#/dev/sdbに接続されたディスクの内容をそのまま/dev/sdc/に出力し、結果としてパーティション情報やファイルシステムごとディスクをコピー
dd if=/dev/sdb of=/dev/sdc
```

# viエディタ操作
## 入力モード
* `i`：カーソルの前にテキストを入力
* `a`：カーソルの後にテキストを入力
* `I`：行頭の最初の文字にカーソルを移動し、その直前にテキストを入力
* `A`：行末にカーソルを移動し、その直後にテキストを入力
* `o`：カレント行の下に空白行を挿入し、その行でテキストを入力
* `O`:カレント行の上に空白行を挿入し、その行でテキストを入力

## カーソル操作
* `h`：1文字左へ移動
* `l`：1文字右へ移動
* `k`：1行上へ移動
* `j`：一行下へ移動
* `0`：行の先頭へ移動
* `$`：行の末尾へ移動
* `H`：画面の一番上の行頭へ移動
* `L`：画面の一番下の行頭へ移動
* `gg`：ファイルの先頭行へ移動
* `G`：ファイルの最終行へ移動
* `nG`：ファイルのn行目に移動
* `:n`：ファイルのn行目に移動

## viの終了、ファイル保存、シェルコマンド実行
* `:q`：ファイルへ保存せずに終了
* `q!`：編集中の内容を保存せずに終了
* `:wq`：編集中の内容を保存して終了
* `ZZ`：編集中の内容を保存して終了（`:wq`と同じ）
* `:w`：編集中の内容でファイルを上書き保存
* `:e!`：最後に保存した内容に復帰
* `:r ファイル名`：ファイルの内容をカレント行以降に読み込む
* `:!コマンド`：viを終了せずにシェルコマンドを実行
* `:r!コマンド`：シェルコマンドの実行結果を挿入
* `:set オプション`：オプション機能を設定。使えるオプションは以下。
  * `number`：行番号を表示
  * `ignorecase`：大文字・小文字の区別をしない
  * `list`：タグや行末文字など、通常表示されていない文字を表示
  * `all`：すべてのオプションを表示
* `:set no オプション`：オプション機能を解除

## 編集コマンド
* `x`：カーソル位置の文字を削除
* `X`：カーソル位置の手前の文字を削除
* `dd`：カレント行を削除
* `dw`：カーソル位置から次の単語までを削除
* `yy`：カレント行をバッファにコピー
* `p`：カレント行の下にバッファの内容を貼り付け
* `P`：カレント行の上にバッファの内容を貼り付け
* `r`：カーソル位置の1文字を置換

## 検索コマンド
* `/パターン`：カーソル位置から後方に向かって指定したパターンを検索
* `?パターン`：カーソル位置から前方に向かって指定したパターンを検索
* `n`：次を検索
* `N`：次を検索（逆方向）
* `:noh`：候補のハイライト表示を解除
* `:%s/A/B/`：最初に見つかった文字列Aを文字列Bに置換
* `:%s/A/B/g`：すべての文字列Aを文字列Bに置換

## 設定変更
* `:set nu`：行番号を表示
* `:set nonu`：行番号を非表示
* `:set ts=タブ幅`：タブ幅を数値で指定

※`:set`で行った変更はviを終了させると消えてしまう。設定を常に有効にするには、ホームディレクトリ内の.exrcファイル（vimを利用している場合は.vimrcファイル）に設定を記述しておく。その場合`set nu`のように`:`を除いて記述する

# シェル

## 変数
``` shell
#変数定義
hoge=1
#変数削除
unset hoge
#シェル変数、環境変数表示
set
#環境変数表示
env
printenv
#変数参照
echo $hoge
=>1
#シェル変数のエクスポート
export hoge
```
## スクリプトに渡す引数
* `$0`：シェルスクリプトファイル名（フルパス）
* `$1`：1番目の引数
* `$#`：引数の数
* `$@`：すべての引数（スペース区切り）
* `$*`：すべての引数（区切りは環境変数IFSで指定されたもの）

## testコマンド
条件分に書かれた式を評価し、真なら0を、偽なら0以外の値を返す。主な条件式は以下

* ファイル形式のテスト
  * `-f ファイル`：ディレクトリなどを除くファイルがあれば真
  * `-d ディレクトリ`：ディレクトリがあれば真
  * `-r ファイル`：ファイルが存在し、かつ読み込み可能であれば真
  * `-w ファイル`：ファイルが存在し、かつ書き込み可能であれば真
  * `-x`：ファイルが存在し、かつ実行可能であれば真
  * `-s ファイル`：サイズが0より大きいファイルがあれば真
  * `-F ファイル`：シンボリックリンクであるファイルがあれば真

* ファイル特性のテスト
  * `-e ファイル`：ファイルがあれば真
  * `ファイル1 -nt ファイル2`：ファイル1がファイル2より修正時刻が新しければ真
  * `ファイル1 -ot ファイル2`：ファイル1がファイル2より修正時刻が古ければ真

* 数値のテスト
  * `数値1 -eq 数値2`：数値1と数値2が等しければ真
  * `数値1 -ge 数値2`：数値1と数値2より大きい、もしくは等しければ真
  * `数値1 -gt 数値2`：数値1が数値2より大きければ真
  * `数値1 -le 数値2`：数値1が数値2より小さい、もしくは等しければ真
  * `数値1 -lt 数値2`：数値1が数値2未満であれば真
  * `数値1 -ne 数値2`：数値1と数値2が等しくなければ真

* 文字列のテスト
  * `-n 文字列`：文字列の長さが0より大きければ真
  * `-z 文字列`：文字列の長さが0であれば真
  * `文字列1 = 文字列2`：2つの文字列が等しければ真
  * `文字列1 != 文字列2`：2つの文字列が等しくなれば真

* テストの論理結合
  * `! 条件`：条件式が偽であれば真
  * `条件1 -a 条件2`：両方の条件式が真であれば真（and）
  * `条件1 -o 条件2`：いずれかの条件式が真であれば真（or）

``` shell
#.bashrcファイルが存在すれば真
[ -f .bashrc ]
#binディレクトリが存在すれば真
[ -d bin ]
#1番目の引数の値が10未満なら真
[ "$1" -lt 10 ]
```