GNUとUNIXコマンド

# シェルとは？
コマンドの入力を受け付け、適切な処理をして結果を表示しているプログラムのこと。ユーザーが入力したコマンドをカーネルに実行させる翻訳者（インタープリタ）の役割を果たす。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/ca019e63-0876-23ee-f223-da383276e7f8.png)


## シェルの種類
いくつか種類があり、Linuxで標準的に利用されているのはbash。
psコマンドを使用することでどのシェルが使われているのかを確認することが出来、システムで利用可能なシェルは`/etc/shells`ファイルで確認可能

| シェルの種類 | 内容 |
|:-:|:-:|
| sh(Bourne Shell)  | UNIXの標準シェル。機能がシンプル  |
| bash(Bourne Again Shell)  | shを拡張して多機能にしたシェル。macOSでも標準  |
| csh(C Shell)  | C言語に似たスクリプトを使えるシェル  |
| tcsh  | cshを拡張したシェル  |
| ksh(Korn shell)  | shを拡張したシェル  |
| zsh  | kshにbashやtcshの機能を取りこんだ多機能シェル  |

## 標準入出力
Linux上で実行されるプログラムはデフォルトで3つの出入り口が用意されている。これらの入力元、出力先を切り替えることが可能になる
末尾の数字は**ファイルディスクリプタ**と言い、それぞれ対応する入出力を表す。

+ **標準入力(STDIN 0)**
+ **標準出力(STDIOUT 1)**
+ **標準エラー出力(STDERR 2)**

![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/3f58f4e5-e8a6-0f37-676d-89ae69f0cc0b.png)


### trコマンド
**書式：tr [オプション][文字列1[文字列2]]**
標準入力から読み込まれた文字列を変換したり、削除したりする
引数にファイルの指定はできないため、ファイルからデータを読み込んだり、変換後のテキストをファイルに出力したりする場合は**リダイレクション**を使用する。

| オプション | 説明 |
|:-:|:-:|
| -d  | [文字列1]でマッチした文字列を削除する  |
| -s  | 連続するパターン文字列を1文字として処理する  |

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

~~~ md
#/etc/hostsファイル内の英小文字を英大文字に変換する
$ tr a-z A-Z < /etc/hosts
$ cat /etc/hosts | tr [:lower:] [:upper:]
~~~



## リダイレクト
コマンドの標準出力を端末画面ではなく、任意のファイルに切り替えることができる。

| 記号 | 説明 |
|:-:|:-:|
| <  | 標準入力の入力元を指定(0<と同義) 。 |
| <<  |ヒアドキュメントと呼ばれ、標準入力の入力元を指定し、終了文字まで入力(0<<と同義)   |
| <<<  | ヒアストリングと呼ばれ、指定した文字列をコマンドの標準入力に送る  |
| >  | 標準出力の出力先を指定(1>と同義)。 ファイルが存在しない場合は新規作成され、ある場合は上書きされる |
| >&  | コマンドを実行した結果の標準出力、標準エラー出力の両方をファイルに格納する |
| >>  | 標準出力の出力先を指定し、出力先に追記(1>>と同義)  |
| 2>  | 標準エラー出力先を指定  |
| 2>>  | 標準エラー出力先を指定し、出力先に追記  |
| >2&  | 標準出力先を標準エラー出力の出力先と同じにする(1>&2と同義)  |
| 2>&1  | 標準エラー出力の出力先を、標準出力の出力先と同じにする  |


![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/d7e76d2b-21c8-9c33-7503-dc70968eb119.png)

::: note info
`/dev/null`という特殊なファイルに書かれたものはすべて消去され、読み込むと常にEOF(End Of File)が返ってくる。

~~~ md
#コマンド実行した際に、標準出力・エラー出力どちらも端末、ファイル、デバイスに表示されない
$ コマンド > /dev/null 1>&2
~~~
:::



## パイプ
**書式：コマンド | コマンド**
標準出力に出力されたコマンドの実行結果を別のコマンドの標準入力に渡すことができる。1画面に収まりきらない出力をlessコマンドで表示するときなどに使用される

![kkk33976.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/5381b617-b69e-7cb9-1c3a-9dc7d0acffc3.jpeg)



### teeコマンド
**書式：tee [オプション]ファイル名**
標準入力から読み込み、それをファイルと標準出力へとT字型に分岐させる。実行結果をファイルに書き込みつつ、次のコマンドへと実行結果を渡すことが出来る。

| オプション | 説明 |
|:-:|:-:|
| -a  | ファイルに上書きせず追記する  |

### xargsコマンド
標準入力から渡された文字列を、指定のコマンドの引数として組み立てて実行するコマンド


## メタキャラクタ
シェルによって特別に解釈される文字のこと

| メタキャラクタ | 内容 |
|:-:|:-:|
| *  | 0文字以上の任意の文字列  |
| ?  | 任意の1文字  |
| ＄ | 変数  |
| [] | []内の任意の1文字  |
| \  | メタキャラクタの打ち消し  |
| '  | 囲まれた文字を文字列とみなす(メタキャラクタの意味を打ち消す)  |
| "  | 囲まれた文字を文字列とみなす(メタキャラクタの意味を打ち消すが、$,`,￥,"は除く)  |
| `  | 囲まれた文字列(変数の場合は格納されている値)をコマンドとみなし、その実行結果を文字列として返す  |

~~~ md
$ echo "$DATE"
date

$ echo '$DATE'
$DATE

~~~


## ファイル名の補完
コマンドやファイルの途中まで入力してTabキーを押すと、残りの部分が保管されるため全部を入力する必要がない。複数見つかった場合、Tabキーをもう一度押すと候補一覧が表示される


## エイリアス
**書式：alias [別名[=コマンド]]**
コマンドに別名を付けることができ、よく使うコマンドに短縮名をつけれたりコマンドとオプションをまとめて1つのコマンドのように使うことが出来る。連続したコマンド処理を簡単に実行することも可能

::: note info
エイリアスの設定はシェルを終了させると消えてしまう。永続的に利用するには、`/.bashrc`の設定ファイルにaliasコマンドを記述する必要がある
:::

### 引用符
シェル上ではスペースを含む文字列は引用符で囲み、コマンドや引数の区切りなどと区別する。ダブルクォーテーションで囲むと変数が展開される。

~~~ md
# aliasコマンドでlslを設定する場合
$ alias lsl=`ls -l | less`
~~~

# 変数について
Linuxで使用できる変数には、シェル変数と環境変数がある。設定されている変数を以下のコマンドで確認することが出来る

| コマンド | 説明 |
|:-:|:-:|
| set  | 全てのシェル変数を環境変数を表示  |
| env  | 全ての環境変数を表示  |
| printenv  | 一部またはすべての環境変数を表示  |

## シェル変数
**書式：変数名=値**
1つのシェルの中だけで使える変数のこと。ユーザーが利用する言語やプロンプトの表示項目など、シェルが動作する上で必要となる様々な情報は変数に保存される。変数はユーザーが任意で設定可能。変数の内容はシェルが終了すると失われる。


#### あらかじめ用意されてる代表的な環境変数

| 変数 | 説明 |
|:-:|:-:|
| HOME  | ログインしているユーザーのホームディレクトリ  |
| HOSTNAME  | ホスト名（コンピュータ名）  |
| HISTFILE  | コマンド履歴保存ファイルのパス |
| LANG  | ロケール。ユーザーの言語処理方式  |
| PATH  | コマンドを検索するディレクトリリスト  |
| PS1  |  プロンプトの表示項目 |
| PWD  |  カレントディレクトリのパス |
| UID  | ユーザーID  |
| USER  | ログインしているユーザー  |

~~~ md
#変数の設定
$ var=Linux

#変数の内容を表示
$ echo $var

#環境変数を表示
$ printenv

#シェル変数と環境変数を表示
$ set

#変数の削除
$ unset
~~~

### setコマンド
オプションを指定せずに実行すると、現在のシェルで定義されているシェル変数の一覧を表示する。

| オプション | 説明 |
|:-:|:-:|
| -o シェルオプション  | シェルオプションを有効にする  |
| +o シェルオプション  | シェルオプションを無効にする  |

| シェルオプション | 説明 |
|:-:|:-:|
| noclobber(-C)  | リダイレクションによる既存のファイルへの上書きを禁止する  |
| histexpand(-H)  | 「!番号」による履歴参照を行う（デフォルトで有効）  |

## 環境変数
**書式：export [変数名[=値]]**
設定したシェルとそのシェル上で起動したシェルや実行したコマンドでも使える変数のこと。


![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/9e2201ca-bd0f-fc9e-27ef-38c33e686a58.png)

# コマンドについて
コマンドには以下の2種類がある。whichコマンドを使用することで、コマンドの実行ファイルがどこにあるか確認ができる。

+ **組み込みコマンド**
シェルに内蔵されているコマンド

+ **外部コマンド**
シェルの外部に同じ名前の実行プログラムとして保存されているコマンド。必要な時に呼び出して実行する。実行するには絶対パスで指定しなければならない。

::: note info
**・コマンドサーチパス**
コマンド名だけ入力し、変数PATHに格納されているディレクトリ内から対応する実行ファイルを検索して実行できる仕組み。
:::

### 環境変数PATH
**書式：PATH=$PATH:追加するディレクトリ名**
環境変数PATHとは外部コマンドが格納されている場所。ディレクトリ名をしていすることで環境変数PATHにパスを追加することができる

+ パスを指定しなくてもコマンドを実行できる
+ シェルは環境変数PATHに定義されたパスから、入力されたコマンドの実行ファイルを順に探す


# シェルスクリプト
実行するコマンドを1つのファイルにまとめて置き、ファイルを呼び出すことで一括して実行すること。一連のコマンド操作を自動化し、効率的にLinuxを操作することが出来る。

基本的に上から下に向かって記述された順にコマンドが実行される。「＃」から右側はコメントみなされる。ただし1行目だけは例外になる

::: note info
**・「#!」シェバン**
スクリプトの最初の1行目に書き、どのシェルでコマンドを実行するかを指定する役割を持つ。
:::


## スクリプトの実行方法
実行するにはいくつか方法が存在する

### bashコマンド
**書式：bash シェルスクリプトファイル名**
シェル変数が以下のように定義されている

+ **PS1(デフォルト:`\s-\v\$`)**:コマンドプロンプト
+ **PS2(デフォルト:`>`)**：コマンドラインが完了せず、継続行である

| 主な表記 | 説明 |
|:-:|:-:|
| \s  | シェルの名前  |
| \v  | bashのバージョン  |
| \u  | ユーザー名  |
| \h  | ホスト名のうちの最初の.まで  |
| \w  | 現在の作業ディレクトリ  |


### sourceコマンド
**書式：source シェルスクリプトファイル名**
元のシェル(sourceコマンドを実行したシェル)のシェル変数のシェルスクリプト内で参照できる点がbashコマンドと異なる。シェルスクリプト内でシェル変数を操作すると、元のシェルに反映される。

### 実行権の設定
**書式：. /シェルスクリプトファイル名**
シェルスクリプトに実行権を設定し、シェルスクリプトのパスを指定する方法。実行するには絶対パスではなくてはならない。

## 引数の利用
コマンド実行と同様に、シェルスクリプトの実行時でも引数を指定することが出来る。シェルスクリプト内で使用可能。1つ指定すると「$1」という特殊な変数に格納され参照することが出来る。

### 終了ステータス
特殊な変数「$?」を使うとコマンド実行が成功したかどうか確認可能。コマンド実行が失敗していれば、シェルスクリプトの実行を直ちに中断して終了するといった処理が出来るようになる。

+ **コマンドの実行が成功なら「0」**
+ **コマンドの実行が失敗なら「0」以外の数値**


# コマンドの実行

| コマンド | 説明 |
|:-:|:-:|
| コマンド1 ； コマンド2  | コマンド1に続いてコマンド2を実行する。コマンド1の終了ステータス関係なくコマンド2を実行する  |
| コマンド1 && コマンド2  | コマンド1が正常に終了したときのみコマンド2を実行する  |
| コマンド1 ｜｜ コマンド2  | コマンド1が正常に終了しなかった場合のみコマンド2を実行する  |
| (コマンド1；コマンド2)  | コマンド1とコマンド2を、ひとまとまりのコマンドグループとして実行する  |
| 両脇にパイプを入れてコマンド1；コマンド2;  | 現在のシェル内でコマンド1とコマンド2を実行する  |


### エスケープ文字
ダブルクォーテーションを用いて、＄記号を変数展開させたくない場合は「\(Windowsの場合は￥)」を使用すると、通常の文字であるとみなされる。

### `(バッククォーテーション)
バッククォーテーション内にコマンドがあれば、そのコマンドを実行した結果が展開される。変数の場合は、変数に格納されているコマンドを実行した結果が展開される。


# テキストフィルタコマンド

### sortコマンド
**書式：sort [オプション][ファイル名]**
行単位でファイルの内容をソートする

| オプション | 説明 |
|:-:|:-:|
| -b  | 行頭の空白を無視  |
| -f  | 大文字、小文字を区別しない  |
| -r  | 降順でソート  |
| -t 区切り文字  | 指定した文字を区切り文字としてフィールドを認識  |
| -n  | 数字を文字でなく数値としてソート  |
| -k フィールド  | ソート対象とするフィールドを指定(デフォルトは1つ目のフィールド)  |

~~~ md
# 以下のファイルの3番目のフィールドを基準に降順にソートする
$ cat file
aaa, 200 , AAA
bbb, 1000, ddd
$ sort -f -k 3 -r -t , file
~~~



### splitコマンド
**書式: split [-行数] [入力ファイル名[出力ファイル名]]**
指定した行数でファイルを分割するコマンド。オプションで何行ごとに分割するかを指定することが出来、指定しなかった場合は**1000行ごとに分割される**。出力されたファイル名には、「出力ファイル名」で指定したファイル名の末尾に「aa」、「ab」、「ac」などの文字列が順番につく

| オプション | 説明 |
|:-:|:-:|
| -l  | 出力の行数を指定する  |
| -d  | 末尾を英字ではなく数字にする  |

~~~ md
#fileファイルを500行ごとにhogeというファイル名で保存する場合
$ split -500 file hoge
~~~

### uniqコマンド
**書式：uniq [オプション] [入力ファイル[出力ファイル]]**
入力されたテキストストリーム(ひとまとまりのテキストデータのこと)の中で**重複している行を調べて、重複している行は1行にまとめて出力する**。

| オプション | 説明 |
|:-:|:-:|
| -d(--repeated)  | 重複している行のみを表示  |
| -u(--unique)  | 重複していない行のみを表示  |


### wcコマンド
**書式: wc [オプション] [ファイル名]**
ファイル内の文字数や行数を調べることが出来るコマンド
オプション指定しなくても、行数、単語数、文字数が順に表示される

| オプション | 説明|
|:-:|:-:|
| -l  | 行数を表示  |
| -w  | 単語数を表示  |
| -c  | 文字(バイト)数を表示  |

~~~ md
#OSに登録されているユーザー数を表示する
$ wc -l etc/passwd
$ cat etc/passwd | wc -l
~~~


### nlコマンド
**書式：nl [オプション] ファイル名**
テキストファイルの一部または全部に行番号を付けて表示する。
オプションなしの場合は空行を除いた行に行番号を付ける

| オプション | 説明 |
|:-:|:-:|
| -b(--body-numbering) a  | 空行を含めた全ての行に行番号を付ける  |
| -b() t  | 空行を除いた行に行番号を付ける  |

::: note info
**catコマンド**でも以下のオプションを入れれば同じ動作になる

| オプション | 説明 |
|:-:|:-:|
| -n  | 空行を含めた全ての行に行番号を付ける  |
| -b  | 空行を除いた行に行番号を付ける  |

:::


### od(Octal Dump)コマンド
**書式：od [オプション] [ファイル名]**
ファイルの内容を8進数や16進数で表示するためのコマンド。

| オプション | 説明 |
|:-:|:-:|
| -t  | 出力フォーマットを指定  |
| -o(デフォルト)  | 8進数2バイト区切りで表示(-t o2と同じ)  |
| -x  | 16進数2バイト区切りで表示(-t x2と同じ)  |
| -c  | ASCII文字またはバックスラッシュ付のエスケープ文字で表示(-t cと同じ)  |

| フォーマット | 説明 |
|:-:|:-:|
| c  | ASCII文字またはバックスラッシュ付のエスケープ文字で表示  |
| o[SIZE]  | 8進数で表示。SIZEで表示を区切るバイト数を指定できる(未指定時4バイト)  |
| x[SIZE]  | 16進数で表示。SIZEで表示を区切るバイト数を指定できる(未指定時4バイト)  |

::: note info
**・ASCII文字とは？？**
アスキーコードとも呼ばれ、アルファベットや数字、記号などを収録した文字コードの一つ。最も基本的な文字コードとして世界的に普及しており、他の多くの文字コードがASCIIの拡張になるよう実装されている。
:::


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

~~~md
#60日を超える日数の間更新されていないファイルの削除
$ find . -mtime +60 -type f | xargs rm

~~~



### cutコマンド
**書式：cut [オプション] ファイル名**
ファイルの各行から指定したフィールドを取り出すコマンド。

| オプション | 説明 |
|:-:|:-:|
| -c 文字数  | 取り出す文字位置を指定する  |
| -d 区切り文字  | フィールドの区切り文字(デリミタ)を指定する  |
| -f フィールド  | 取り出すフィールドを指定する  |
| -b  | 指定された位置の各バイトだけを表示する  |
| -s  | フィールドの区切り文字を含まない行を表示しない  |

~~~ md
#/etc/passwdファイルにあるユーザー名(1列目)とログインシェル(7列目)を表示する
$ cut -d : -f 1,7 /etc/passwd
~~~



# マニュアルの参照

## man(manual)コマンド
**書式：man [オプション][セクション]コマンド名あるいはキーワード**
Linuxには数千ものコマンドが用意されている。オンラインマニュアルとも呼ばれ、以下の内容を調べることができる。マニュアルの終了は「q」、ヘルプの表示は「h」

「man hier(hierarchy：階層構造)」でFHS構造の詳細を知ることが可能

+ コマンドの使い方
+ 引数やオプションの指定方法
+ オプションの意味
+ コマンド出力する内容


::: note info
オンラインマニュアルはディストリビューションに含まれるパッケージをインストールした場合「`usr/share/man`」以下のサブディレクトリに格納されているため、ネットワーク上のデータを表示しているわけではない。
インターネットからダウンロードしてインストールした場合は「`/usr/local/share/man`」に置かれる。
manページの検索ディレクトリは、環境変数MANPATHが参照される

:::

| オプション | 説明 |
|:-:|:-:|
| -a  | 全てのセクションのマニュアルを表示する  |
| -f  | 指定されたキーワード(完全一致)を含むドキュメントを表示する。wahtisコマンドと同じ結果を表示する  |
| -k  | 指定されたキーワード（部分一致）を含むドキュメントを表示する。aproposコマンドと同じ結果を表示する  |
| -w  | マニュアルの置かれているディレクトリを表示する  |

~~~ md
#passwdコマンドの第1セクションのマニュアルを表示する場合
$ man 1 passwd
~~~



| キー操作 | 説明 |
|:-:|:-:|
| Space  | 次のページを表示  |
| Enter  | 次の行を表示  |
| b  | 前のページを表示  |
| n  | ヘルプを表示  |
| q  | manコマンドの終了  |
| /文字列  | 指定した文字列で検索(nキーで次の検索)  |


### セクション
コマンドの使いかた以外にも、設定ファイルの書式、プログラミングに必要な情報などいくつかのカテゴリに分かれている。

| セクション番号 | 説明 |
|:-:|:-:|
| 1  | 一般ユーザーコマンド  |
| 2  | システムコール(カーネルの機能を使うための関数) |
| 3  | ライブラリ(C言語の関数)  |
| 4  | デバイスファイル  |
| 5  | 設定ファイルの書式(`/etc/passwd`、`/etc/crontab`など)  |
| 6  | ゲーム  |
| 7  | その他 |
| 8  | システム管理コマンド  |
| 9  | Linux独自のカーネル用ドキュメント  |


~~~ md
#例　passwdのオンラインマニュアルを表示する場合
$ man passwd

#例　passwdの設定ファイルを表示する場合
$ man 5 passwd
~~~


## whatisコマンド
オンラインマニュアルの最初の行だけを抜き出して表示することが出来る。オンラインマニュアルにどのようなセクションがあるかわからない場合に有効

~~~ md
#例　whatisコマンド実行例
$ whatis passwd
~~~

::: note warn
rootユーザーにログインして「makewhatis」コマンドをあらかじめ実行しておかなければならない。通常は自動実行だが、起動直後は手動で行う時がある
:::

## --helpオプション
コマンドによってヘルプが用意されているものがある。オンラインマニュアルより簡潔な説明が表示される

~~~ md
#例　パスワードのヘルプ表示
$ passwd --help
~~~


# ファイル操作コマンド

### ls(List Segments)コマンド
**書式：ls [オプション] ファイル名またはディレクトリ名**
ディレクトリを指定した場合はディレクトリ内のファイルを、ファイル名を指定した場合はそのファイル属性を表示する。
引数に何も指定しない場合は、カレントディレクトリ内のファイルとサブディレクトリを表示する

| オプション | 説明 |
|:-:|:-:|
| -a  | 隠しファイルを含む全てのファイルとディレクトリを表示する  |
| -A  | カレントディレクトリと親ディレクトリ以外の隠しファイルを含むファイルとディレクトリを表示する  |
| -d  | 指定したディレクトリの情報を表示  |
| -F  | 名前の後ろにファイルタイプを表示。通常ファイル：なし、実行可能ファイル：＊、ディレクトリ：/、シンボリックリンク：＠  |
| -i  | iノード番号を付けて表示  |
| -l  | 詳細情報を表示  |
| -R  | サブディレクトリの内容も再帰的に表示  |

### cd(Change Directory)コマンド
**書式：cd [ディレクトリ]**
ファイルシステム内を移動するコマンド。相対パス、絶対パスで指定するほか、記号で入力し移動することも可能。ディレクトリ名を指定しない場合はホームディレクトリに移動する。

::: note info
ログインユーザーが「**cd ~/ユーザー名**」を実行すると、ホームディレクトリに移動する。ただし、アクセス権限さえあれば現在のユーザー名以外に指定し実行すると他のユーザーのホームディレクトリに移動することも可能
:::

### historyコマンド
**書式：history [オプション]**
コマンドの実行履歴を確認するコマンド。オプション指定がない場合は、全ての履歴が表示される。
実行履歴の保存先は、デフォルトで`~/.bash_history`が使用される

| オプション | 説明 |
|:-:|:-:|
| -c  | そのシェルの実行履歴を消去する  |
| -d [履歴番号]  | 指定した履歴番号のコマンドをそのシェルの履歴から消去する  |

### cp(copy)コマンド
**書式：cp [オプション] コピー元ファイル名 コピー先ファイル名**
ファイルやディレクトリを複製するコマンド。他のディレクトリに複製する場合は同じ名前にすることも可能。

| オプション | 説明 |
|:-:|:-:|
| -i(--interactive)  | コピー先に同名ファイルが存在する場合、上書きするか確認する  |
| -f(--force)  | コピー先に同名ファイルが存在しても、強制的に上書きする  |
| -p  | コピー元の所有者、タイムスタンプ、アクセス権などの情報を保持したままコピーする  |
| -R/-r(--recursive) | コピー元のディレクトリ階層をそのままコピーする  |


### rm(remove)コマンド
**書式：rm [オプション] ファイル名**
ファイルを削除するコマンド。

| オプション | 説明 |
|:-:|:-:|
| -i(--interactive)    | ファイルを削除する前にユーザーへ確認する  |
| -f(--force)   | ユーザーへの確認なしに削除する  |
| -R/-r(--recursive) | 指令されたディレクトリ内にファイル、ディレクトリが存在していても全て削除する  |

::: note info
**rmdir**コマンドを利用して、空のディレクトリを削除することも出来る
:::



# 正規表現(Regular Expression)
文字列のパターンを表記するための手法で、様々なメタキャラクタを利用できる。

| メタキャラクタ | 説明 |
|:-:|:-:|
| .  | 任意の1文字にマッチする  |
| *  | 直前にある文字の0回以上の繰り返しにマッチする  |
| ?  | 直前にある文字の0回または1回の繰り返しにマッチする(拡張)  |
| +  | 直前にある文字の1回以上の繰り返しにマッチする(拡張)  |
| []  | 文字クラスと呼ばれ、[]内の任意の1文字にマッチする 。カッコ内に＾が先頭に置かれている場合は、「～以外」を表す |
| ^ | 行頭にマッチする(最初にあるときのみ有効)  |
| $  | 行末にマッチする(最後にあるときのみ有効)  |
| \  | 直後に続くメタキャラクタの意味を解除する  |

::: note warn
シェルのメタキャラクタと混同しないように注意！！
:::

### grep(Global Regular Expression Print)コマンド
**書式：grep [オプション][文字列パターン][検索対象ファイル]**
テキストファイルの内容を検索し、指定した正規表現にマッチする行があれば表示するコマンド。

| オプション | 説明 |
|:-:|:-:|
| -F  | 文字列パターンを正規表現ではなく単なる文字列として扱う  |
| -c（--count）  | マッチした行数だけを表示する  |
| -i（--ignore-case）  | 大文字と小文字を区別せずに検索する  |
| -l  | マッチした行のあるファイルのみを表示する  |
| -n（--line-number）  | 行番号も合わせて表示する  |
| -v（--invert-match） | マッチしなかった行を表示する  |
| -E（--extended-regexp）  | 拡張正規表現が使える(egrepコマンドと一緒) |



~~~ md
# httpd.confファイルから、行頭が「#」ではない行を抽出
$ grep -v '^#' httpd.conf

#file1から文字列fooを大文字/小文字に区別せずに検索する
$ cat file1 | grep -i foo
~~~


### egerp(Enhanced GREP)コマンド
拡張正規表現を使用するコマンド。オプションはgrepコマンドと同じ動きをする

| メタキャラクタ | 説明 |
|:-:|:-:|
| ?  | 直前にある文字の0回または1回の繰り返しにマッチする |
| +  | 直前にある文字の1回以上の繰り返しにマッチする  |
| (パイプ記号) | 左右いずれかの記述にマッチする |
| {n}  | 直前の文字のn回の繰り返し |
| {n,m}  | 直前の文字のn回からm回の繰り返し |


### fgrep(Fixed string GREP)コマンド
引数で指定された文字列を基に検索するコマンド。grepコマンドと異なり、**正規表現**を使用しない。


### ハッシュ関数
**種類：MD5,SHA1,SHA256,SHA512など**
ファイルを一方方向に暗号化し、ハッシュ値（一定の長さの文字列）にすることが出来る。ハッシュ値はファイルの大小にかかわらず同じ長さであり、元のファイルを少しでも変更すると全体が大きく変化する。ファイルのチェックサムとして利用される。

**-c,--checkオプションで読み込んだファイルの値と照合できる**


::: note info
**・ファイルのチェックサムとは？？**
ファイルが改ざんされたり破損したりしていないかの確認をする。ハッシュ関数は一方方向での暗号化のため、ハッシュ値から元のデータを復元することができない
:::

| コマンド | 説明 |
|:-:|:-:|
| md5sum  | MD5(Message Digest Algorithm 5)によるハッシュ値を出力する  |
| sha1sum  |SHA1によるハッシュ値を出力する   |
| sha256sum  | SHA256(Secure Hadh Algorithm 256)によるハッシュ値を出力する  |
| sha512sum  | SHA512(Secure Hadh Algorithm 512)によるハッシュ値を出力する  |



### sed(Stream Editor)コマンド
**書式：sed [オプション] コマンド [ファイル]**
テキストストリームに対して編集を行うコマンド。編集する内容をコマンドやスクリプトとしてsedに指示しておき、その指示に基づいてストリームの編集を行って、標準出力に編集結果を書き出す。

| オプション | 説明 |
|:-:|:-:|
| -e  | 編集コマンドを複数指定(編集コマンドが1つの場合は省略可)  |
| -f  | 編集コマンドを記述したファイルを指定  |

| 編集コマンド | 説明 |
|:-:|:-:|
| s/文字列1/文字列2/  | 各行の最初に現れる文字列1を文字列2に置換  |
| s/文字列1/文字列2/g  | 全ての文字列1を文字列2に置換  |
| /文字列/d  | 文字列が含まれる行を削除  |
| 行番号1,行番号2d  | 行番号1から行番号2までの行を削除  |
| y/文字1文字2.../文字3文字4.../  | 文字1を文字3に、文字2を文字4に置換  |


~~~ md
#各行の最初に現れる大文字1文字、小文字1文字を「-」に置換する
$ cat test.txt
CentOS
$ sed s/[A-Z][a-z]/-/ test.txt
-ntOS

#fileAの中のbobという文字列を全てBobに変換して表示
$ sed 's/bob/Bob/g' fileA
~~~

::: note info
OSによって改行コードが以下の通り異なってくる
+ CRLF(\r\n):Windows
+ LF(\n):UNIX OS(Linux,Mac OSなど)
+ CR(\r):古いMac OS(バージョン9まで)

CR(キャリッジリターン)は「**^M**」という制御コードでも表されるため、取り除くことでLinuxの改行コードLFに変換することが出来る

~~~ md
#Windowsで作成した[file.txt1」を改行コード変換して「file2.txt」として保存する場合
$ tr -d '^M' < file1.txt > file2.txt
$ sed s/^M//g file.txt > file2.txt
~~~
:::



# テキストファイルの編集
**書式：vi [-R]ファイル名**
ファイルを編集するときは**vi(visual editor**)と呼ばれるテキストエディタを使用する。現在はVim(Vi Improved)がviエディタとして搭載されている。
指定したファイルが存在しない場合はそのファイル名で新規作成することになる。
2つのモードがあり切り替えながら作業を行っていく

::: note info
オプション指定することで、**指定したファイルを読み取り専用で開く**ことが出来る
:::



## コマンドモード
キーボードから入力した文字はすべて「viエディタのコマンド」であるとみなされれ、カーソルの移動でさえ移動するための「コマンド」を実行する必要がある。

+ **viエディタの主なカーソル移動コマンド**

|  キー操作 | 説明 |
|:-:|:-:|
| h(←キー)  | 1文字左へ移動する  |
| j(↓キー)  | 1文字下へ移動する  |
| k(↑キー)  | 1文字上へ移動する  |
| l(→キー)  | 1文字右へ移動する  |
| H  | 画面の最上行へ移動  |
| L  | Last line on the windowの略。画面の最下行へ移動  |
| 0  | 現在カーソルがある行の行頭へ移動する  |
| $  | 現在カーソルがある行の行末へ移動する  |
| gg  | ファイルの先頭に移動する  |
| G  | ファイルの末尾に移動する  |
| nG  | ファイルのn行目に移動する  |
| :n  | ファイルのn行目に移動する  |
| Ctrl+f  | ファイルの末尾に向かって1画面ずつ移動する  |
| Ctrl+b  | ファイルの先頭に向かって1画面ずつ移動する  |


### 編集操作
コマンドの直前に数字を入力すると、数字の回数だけコマンドが繰り返される。

+ **viエディタの主な編集コマンド**

| キー操作 | 説明 |
|:-:|:-:|
| dd  | 現在カーソルがある行を切り取る  |
| dw  | カーソル位置の単語を削除し、バッファにコピーする  |
| yy  | 現在カーソルがある行をコピーする  |
| yw  | yank wordという意味で、カーソルの位置の単語をバッファにコピーする  |
| x(Deleteキー)  | カーソル位置の1文字を切り取る  |
| X(Backspaceキー)  | カーソル位置の左の1文字を切り取る  |
| u | 直前の操作を取り消す  |
| p  | バッファの内容を挿入(文字や単語はカーソルの右、行はカーソルの下に挿入) |
| P | バッファの内容を挿入(文字や単語はカーソルの左、行はカーソルの上に挿入)  |

::: note info
切り取られた行のことを**バッファ**と言う。いわゆるクリップボード
:::




## 挿入モード(入力モード)
メッセージラインに「--INSERT--」と表示され、キーボードからの入力はそのまま文字として挿入される。コマンドモードに戻る際は「escキー」を押下する。

+ **viエディタの主なカーソル移動コマンド**

| キー操作 | 説明 |
|:-:|:-:|
| i  | カーソル位置から入力を開始する  |
| I  | カーソルを行頭に移動し、その位置から入力を開始する  |
| o  | 現在カーソルがある行の下に空白行を挿入し、その行で入力を開始する  |
| O  | Open lineの略。現在カーソルがある行の上に空白行を挿入し、その行で入力を開始する  |
| a  | カーソルの右側の位置から入力を開始する  |
| A  | カーソルを行末に移動し、その右側の位置から入力を開始する  |
| :r ファイル名  | カーソルがある行の下にファイルが読み込まれる  |




## exモード
文書の保存や、viエディタの終了、検索や文字列の置換を行う。

::: note info
**・メッセージラインとは？？**
コマンドモードで「：」を入力すると、カーソルが画面最下行に移動する行のこと。
:::


### 文字列の検索
| viコマンド | 説明 |
|:-:|:-:|
| /文字列  | 現在のカーソル位置からファイルの末尾に向かって検索  |
| ?文字列  | 現在のカーソル位置からファイルの先頭に向かって検索  |
| n  | 次を検索  |
| N  | 前を検索  |

### vi実行中のコマンド操作
「:!」を付けることで、編集中でもコマンド操作をすることが可能。編集中のファイルのパーミッションを調べることも出来る。


### 設定変更
コマンドモードで「:set」を入力すると、様々な設定を変更することができる。

| コマンド | 説明 |
|:-:|:-:|
| :set number  | 行番号の表示  |
| :set nonumber(nonu)  | 行番号の非表示  |
| :set hisearch  | 検索結果をハイライト表示  |
| :set nohisearch  | 検索結果をハイライト表示しない  |
| :set tabstop(ts)=<文字数>  | タブスペースを指定する  |


| その他の設定変更 | 説明 |
|:-:|:-:|
| set -o vi  | viモードに設定する  |
| set -o emacs  | emacsモードに設定する  |

::: note info
ホームディレクトリ内に「.vimrcファイル」を作成しsetコマンドを記述しておくと、viエディタのデフォルトの設定として利用できる。その際は行頭の「：」は不要
:::


### ファイルの保存、終了

| コマンド | 説明 |
|:-:|:-:|
| :q  | viを終了。内容が変更されている場合は警告が出て終了不可  |
| :q!  | viを強制終了。内容が変更されている場合でも保存せず終了  |
| :w   | 編集内容を保存  |
| :w ファイル名  | 編集内容を指定したファイルに保存  |
| :wq,:x,ZZ  | 編集内容を保存しviを終了  |
| :wq!  | 編集内容を強制保存しviを終了。読み取り専用のファイルでも強制手金い保存して終了  |

::: note warn
一般ユーザーで編集できないファイルは「:wq!」を実行しても、**強制保存できずviも終了することができない**
その場合は「:q!」を実行して強制的にviを終了させる
:::




# nanoエディタ
Ubuntuでは標準のテキストエディタ。viエディタのような切り替えるモードはない。CentOSにインストールすることができ、rootユーザーのみ実行可能

~~~ md
# nanoエディタのインストール
# yum install nano
~~~

viエディタと違って操作方法が画面上に出てくる。「＾」はCtrlキーを指している。