Liunx テキスト操作 チートシート

# 正規表現

| 正規表現 | 意味 |
|:-|:-|
| `.` | 任意の 1 文字<br>`a.` → "a" 1 文字にマッチ |
| `^` | 行の先頭<br>`^hello` → 先頭が "hello` で始まる行にマッチ |
| `$` | 行の末尾<br>`hello$` → 末尾が "hello" で終わる行にまt |
| `?` | 直前の表現が 0 回もしくは 1 回 |
| `*` | 直前の表現が 0 回以上連続 |
| `+` | 直前の表現が 1 回以上連続 |
| `{n}` | 直前の表現が n 回連続 |
| `{n,}` | 直前の表現が n 回以上連続 |
| `{n,m}` | 直前の表現が n 回以上 m 回以下連続 |
| `()` | グループ化<br>`(ab)+` → "ab"、"aba"、"ababc" にマッチ |
| `[]` | [文字クラス](#文字クラス)<br>`[abc]` → "a"、"b"、"c" いずれかを含む行にマッチ<br>`[^abc]` → a,b,c のいずれかを含まない行にマッチ（**否定**）<br>`[a-g]` → アルファベット順の a ~ g のいずれかを含む行にマッチ |
| `\|` | OR（左右のどちらか）<br>`'aaa\|bbb'` → aaa または bbb を含む行に一致（`\` はエスケープ用） |

# 文字クラス
学習中

正規表現やパターンマッチングで使われる概念。

特定の文字の集合を表し、特定の範囲や種類の文字とマッチさせるために使われる。


| 文字クラス | 説明 | マッチする例 |
|:-|:-|:-|
| `[abc]` |	`a` または `b` または `c` | `a`、`b`、`c` |
| `[0-9]` |	`0` から `9` の数字 | `3`、`7` |
| `[a-z]` |	アルファベット（小文字） | `m`、`z` |
| `[A-Z]` |	アルファベット（大文字） | `M`、`Z` |
| `[a-zA-Z]` | アルファベット（大文字・小文字） | `b`、`Q` |
| `[^a-zA-Z]` | アルファベット以外（**否定**） | `1`、`¥`、`$` |

| POSIX の文字クラス | 意味 |
|:-|:-|
| `[:alpha:]` | アルファベット（`A-Z, a-z`） |
| `[:digit:]` | 数字（`0-9`） |
| `[:alnum:]` | 英数字（`A-Z`、`a-z`、`0-9`） |
| `[:upper:]` | 大文字（`A-Z`） |
| `[:lower:]` | 小文字（`a-z`） |
| `[:space:]` | 空白・タブ・改行 |
| `[:punct:]` | 句読点（`,`、`.`、`!`） |

POSIX の文字クラス `[:alpha:]` だけを書くと、単なる文字列とみなされてしまい、正規表現のパターンとして認識されないため、POSIX の文字クラスは「通常の文字クラス」 `[...]` の中に埋め込む必要がある。

```console:正規表現として認識されない
$ grep '[:alpha:]' file.txt
```

```console:正規表現として認識される
$ grep '[[:alpha:]]' file.txt
```

# `$ grep`
global regular expression print

テキストファイルや [標準入力](https://qiita.com/AsahinaKei/items/301b88e464c23aba231e#%E6%A8%99%E6%BA%96%E5%85%A5%E5%8A%9B--stdin) の中から、特定のパターン（文字列、正規表現 を利用して、検索対象が含まれる **行を検索する**。

データの受け取り方には「ファイルからデータを受け取る」方法と「標準入力からデータを受け取る」方法の 2 種類がある。

```console:ファイルからデータを受け取る
$ grep パターン ファイル
```

```console:標準入力からデータを受け取る
$ コマンド | grep パターン
```

**オプション**

```console:大文字小文字の違いを無視して検索する（ignore case）
$ grep -i パターン ファイル
```

```console:パターンに一致しない行を表示する（invert match）
$ grep -v パターン ファイル
```

ディレクトリ内から特定のファイルを検索することもできる。

```console:ディレクトリ内のファイルを検索する
$ grep パターン ディレクトリ
```

```console:サブディレクトリを検索対象に含める（recursive）
$ grep -r パターン ディレクトリ
```



# `$ tr`
translate

[標準入力](https://qiita.com/AsahinaKei/items/301b88e464c23aba231e#%E6%A8%99%E6%BA%96%E5%85%A5%E5%8A%9B--stdin) から受け取った文字列を変換し、[標準出力](https://qiita.com/AsahinaKei/items/301b88e464c23aba231e#%E6%A8%99%E6%BA%96%E5%87%BA%E5%8A%9B--stdout) に出力する。

```console:「文字セット1」を「文字セット2」に変換する
$ tr 文字セット1 文字セット2
```

```console:指定した文字を削除する（delete）
$ tr -d 文字セット
```

文字セットには [文字クラス](#文字クラス) を利用することもできる。

# `$ tail`

ファイルの末尾を表示する。

デフォルトでは末尾 10 行文が出力される。

```console:テキストファイルの末尾 10 行を表示する
$ tail ファイル
```

**オプション**

```console:表示する行数を指定する（number）
$ tail -n 行数 ファイル
```

`-f` オプションを使用すると、ログファイルなど、リアルタイムで更新されるファイルの末尾を監視できる。変更があった場合、即座に新しい行を表示する。

```console:ファイルの末尾を監視する（follow）
$ tail -f ファイル
```

# `$ head`

[`$ tail`](#tail) と逆で、ファイルの先頭行を表示する。

デフォルトでは先頭の 10 行文が出力される。

```console:テキストファイルの先頭 10 行を表示する
$ head ファイル
```

```console:表示する行数を指定する（number）
$ head -n 行数 ファイル
```

# `$ cut`

テキストファイルから、特定のフィールドや文字を抽出する。

CSV ファイルやログファイルなど、区切り文字で整理されたデータを扱う際に便利。

データの受け取り方には「ファイルからデータを受け取る」方法と「標準入力からデータを受け取る」方法の 2 種類がある。

```console:ファイルからデータを受け取る
$ cut ファイル
```

```console:標準入力からデータを受け取る
$ コマンド | cut
```

**オプション**

```console:文字単位で切り取る（character）
$ echo "abcdefg" | cut -c 1-5 # 1文字目から5文字目までを取得
abcde

$ echo "abcdefg" | cut -c 1,3,5 # 1,3,5文字目を取得
```

```console:フィールド単位で切り取る（field）
$ echo "apple    banana    orange" | cut -f 2 # 2つ目のフィールドを取得（デフォルトではタブ区切り）
```

```console:区切り文字を指定する（delimiter）
$ echo "apple,banana,orange" | cut -d ',' -f 2 # 2つ目のフィールドを取得（カンマ区切り）
```

# `$ split`

指定したファイルを複数の小さなファイル（チャンク、塊）に分割する。

```console:基本構文
$ split ファイル 出力ファイルの接頭辞
```

出力ファイルの接頭辞（プレフィックス）は、ファイルを分割した際に使用される。デフォルトでは `x` が使用される。

```console:分割後のファイル名に接頭辞を指定する
$ split ファイル prefix_ # prefix_a, prefix_b などのファイル名で分割される。
```

接尾辞（サフィックス）はデフォルトでは `aa`、`ab` などになっているが、数値に変更することができる。

```console:分割後のファイル名に数字の接尾辞を指定する
$ $ split -d -l 10 ファイル prefix_ # 10行ごとに分割し、接尾辞が 00, 01, 02... となる
```

```console:指定した行ごとに分割する（lines）
$ split -l 行数 ファイル
```


```console:指定したバイトごとに分割する（bytes）
$ split -b バイト数 ファイル 
$ split -b 1 ファイル # 1 バイトごと
$ split -b 1k ファイル # 1 キロバイトごと
$ split -b 1m ファイル # 1 メガバイトごと
$ split -b 1g ファイル # 1 ギガバイトごと
```

# `$ sort`

出力先を明示的に指定しない場合、並び替え結果は [標準出力](https://qiita.com/AsahinaKei/items/301b88e464c23aba231e#%E6%A8%99%E6%BA%96%E5%87%BA%E5%8A%9B--stdout) に吐き出される。

```console:並び替え結果は標準出力に送信される
$ sort ファイル
```

**オプション**

```console:アルファベット、数値の降順に並び替える（reverse）
$ sort -r ファイル
```

```console:数値の昇順に並び替える（numeric）
$ sort -n ファイル
```

```console:重複を削除しながら並び替える（unique）
$ sort -u ファイル
```

```console:並び替え結果を別ファイルに出力する
$ sort ファイル -o 出力先ファイル
```

# `$ uniq`
unique

隣接する重複行を削除する。

出力先を明示的に指定しない場合、処理結果は [標準出力](https://qiita.com/AsahinaKei/items/301b88e464c23aba231e#%E6%A8%99%E6%BA%96%E5%87%BA%E5%8A%9B--stdout) に吐き出される。

```console:隣接する重複行を削除する
$ uniq ファイル 出力先ファイル
```

```console:処理結果は標準出力に送信される
$ uniq ファイル
```

**連続する重複のみを削除する** ため、事前に [`$ sort`](#-sort) しておくと、全ての重複を除去することができる。


**オプション**

```console:一度しか出現しないものを表示する（unique）
$ uniq -u ファイル
```

```console:重複している行だけを表示する（duplicate）
$ uniq -d ファイル
```

```console:重複行をカウントする（count）
$ uniq -c ファイル
```

```console:大文字小文字を区別しない（ignore case）
$ uniq -i ファイル
```

# `$ less`

```console:ファイルの内容をページ単位で表示する
$ less ファイル
```

```console:標準入力から受け取ったデータをページ単位で表示する
$ コマンド | less
```

| 操作 | 説明 |
|:-|:-|
| `q` | 終了する |
| `f` / `Space` | 次のページに進む（forward） |
| `b` | 前のページに戻る（back） |
| `↓` / `j` | 次の行に移動 |
| `↑` / `k` | 前の行に移動 |
| `G` | ファイルの末尾に移動 |
| `g` | ファイルの先頭に移動 |
| `/文字列` | 文字列を前方検索 |
| `?文字列` | 文字列を後方検索 |
| `n` | 検索で見つかった次の場所に移動 |
| `N` | 検索で見つかった前の場所に移動 |


# `$ wc`
word count

テキストファイルの行数、単語数、文字数、バイト数などをカウントする。

データの受け取り方には「ファイルからデータを受け取る」方法と「標準入力からデータを受け取る」方法の 2 種類がある。

```console:ファイルからデータを受け取る
$ wc ファイル
```

```console:標準入力からデータを受け取る
$ コマンド | wc
```

**オプション**

```console:行数をカウントする（lines）
$ wc -l ファイル
```

```console:単語数をカウントする（words）
$ wc -w ファイル
```

```console:文字数をカウントする（characters）
$ wc -c ファイル
```

```console:バイト数をカウントする（bytes）
$ wc -b ファイル
```

# `$ sed`
Stream Editor

`$ vi` などの対話形式のエディタと異なり、テキストファイルや [標準入力](https://qiita.com/AsahinaKei/items/301b88e464c23aba231e#%E6%A8%99%E6%BA%96%E5%85%A5%E5%8A%9B--stdin) のデータに対して、一括で置換、挿入、削除、追加などの処理を行うことができる。

**ストリームエディタ** とも呼ばれる。

使用したデータファイルには変更が加わらない。内部的には、読み込まれたデータは一時的にバッファに格納され、処理結果は [標準出力](https://qiita.com/AsahinaKei/items/301b88e464c23aba231e#%E6%A8%99%E6%BA%96%E5%87%BA%E5%8A%9B--stdout) に出力されている。

```console:基本構文
$ sed '編集コマンド' ファイル
```

**オプション**

```console:置換（subustitute）
$ sed 's/検索文字列/置換文字列/オプション' ファイル
$ sed 's/foo/bar/' ファイル  # 最初に見つかった foo を bar に置換
$ sed 's/foo/bar/g' ファイル # 行内のすべての foo を bar に置換
```

```console:削除（delete）
$ sed '3d' ファイル  # 3行目を削除
$ sed '2,4d' ファイル  # 2行目から4行目を削除
$ sed '/foo/d' ファイル # foo を含む行を削除
```

```console:出力（print）
$ sed -n '5p' ファイル # 5行目を出力
$ sed -n '2,4p' ファイル # 2行目から4行目を出力
```

```console:追加（append）
$ sed '3a 追加テキスト' ファイル  # 3行目の後に "追加テキスト" を追加
```

```console:追加（inseret）
$ sed '3i 挿入テキスト' ファイル  # 3行目の後に "挿入テキスト" を挿入
```

# `$ find`

https://qiita.com/AsahinaKei/items/09ee7ce55b1a0be01ff0#-find


# `$ vim`

```console:vim を起動する
$ vim ファイル名
```

`$ vim` に様々な **モード** があり、特定のキーを押すことによってこれを切り替え、編集を行うことができる。

**モードの切り替えは必ずノーマルモードを介して行う必要がある**。

例えば「挿入モード」から直接「検索モード」に切り替えることはできない。

| モード、操作 | キー、説明 |
|:-|:-|
| ノーマルモード | `Esc` |
| 挿入モード | `I`（Insert）<br>カーソルの前から文字挿入開始 |
| 挿入モード | `A`<br>カーソルの後ろから文字挿入開始 |
| 挿入モード | `O`<br>カーソルの 1 行下に新しい行を挿入後、新しい行の先頭から文字挿入開始 |
| 上書きモード | `SHIFT` + `R` |
| 検索モード | `/`：カーソルからファイルの末尾に向かって検索<br>`?`：カーソルからファイルの先頭に向かって検索<br>切り替えた後は、検索文字列を入力して `Enter` を押す。検索実行後、ノーマルモードに戻り、`N` キー（Next）を押すと、次のヒット結果まで飛ぶことができる。前のヒット結果まで戻る場合は `SHIFT` + `N` キーを同時押しする。 |
| 選択モード | `V`<br>切り替え後は `→` `↓` `←` `↑` キーで選択範囲を決定する。この状態で `Y` キーを押すと、選択範囲をクリップボードにコピーすることができる（**ヤンク**：yank）。貼り付けは `SHIFT` + `P` で行う。行をまるごとコピーしたい場合は `Y` キーを2回押す。 |
| アンドゥ | `U`（Undo）<br>取り消し |
| リドゥ | `Ctrl` + `R` 同時押し（Redo）<br>取り消しの取り消し |
| 末尾に移動 | `SHIFT` + `G` 同時押し |
| 終了する | **ノーマルモードに遷移後に入力する**（`q`:Quit、`w`:Write）<br>保存しない：`:q` → `Enter`<br>保存しない（編集した場合）：`:q!` →  `Enter`<br>保存する：`:wq` → `Enter`<br>ファイル名を指定して保存する：`:wq ファイル名` → `Enter` |
| `vim` から抜けずにコマンドを実行する | `! コマンド` |

| 削除に関わるコマンド | 説明 |
|:-|:-|
| `dw` | カーソル以降の単語を削除 |
| `nx` | カーソルから右の n 文字分を削除 |
| `dd` | カーソル行を削除 |
| `ndd` | カーソル行から n 行分を削除 |
| `D` | カーソルから同じ行の末尾までを削除 |


| コピーに関わるコマンド | 説明 |
|:-|:-|
| `yy` | カーソル行をコピー |
| `yw` | 単語をコピー |
| `P` | カーソル行の上に貼り付け |
| `p` | カーソル行の下に貼り付け |