Unix/Linux に関する grep コマンド

## 役割
**Grep** フィルタは、ファイル内の特定の文字パターンを検索し、そのパターンを含むすべての行を表示します。ファイル内を検索するパターンを[正規表現](https://qiita.com/richmikan@github/items/b6fb641e5b2b9af3522e)といいます。. (**grep** グローバル検索と正規表現の出力を表します)。

## 文法

> `grep` -options（パラメータ） pattern（キーワード） files（テキストファイル）

## 主なパラメータ

> `-c` ：マッチパターンの**行数**だけ出力します。
`-h` ：一致した行のみが表示され、ファイル名は表示されません。
`-i` ：マッチ時の大文字小文字は無視します。
`-l` ：ファイル名のリストだけが表示されます。
`-n` ：一致する**行と行番号**が表示されます。
`-r` ：ファイルが存在するディレクトリ、すなわちパスを表示する。
`-v` ：一致しない行がすべて出力されます。
`-e` exp ： このオプションを指定する式は、複数回使用できます。
`-f` file ：1つまたは複数のルールスタイルを含むルールファイルを指定し、grepに、1行に1つのルールスタイルでルールの条件を満たすファイル内容を検索させる。
`-E` ：スタイルを拡張された正規表現として使います。
`-w` ：単語全体にマッチする。
`-r` ：サブディレクトリを検索することは明示的に要求されます。
`-d skip` ：サブディレクトリを無視する。
`-o` ：一致行の一致部分のみが印刷され、その各部分は別々の出力行に印刷される。
`\` ：正規表現の特殊文字の本来の意味は無視されます。
`[ ]`：[a]のような単一の文字、すなわちaが要件を満たす。
`[ - ]`：[a-z]のような範囲、つまり、a、b、cからzまでが一致します。
`.`：全ての文字を表しています。
`*`：すべての文字、長さは0でもよい。<br/>
`-A n` : お手本のスタイルに合った行を表示する以外は、その行の次の`n`行を表示する。
`-B n` : お手本のスタイルに合った行を表示する以外は、その行の前の`n`行を表示する。
`-C n` : お手本のスタイルに合った行を表示する以外は、その行の前後の`n`行を表示する。

## 命令例
①. 入力として次のファイルを考えます，キー入力`cat > geekfile.txt` そして、enterキーを押します；

```bash
$ cat > geekfile.txt
```
②. 次のように入力する、そして、enterキーを押します；

```bash
unix is great os. unix is opensource. unix is free os.
learn operating system.
Linux is a family of open-source Unix-like operating systems based on the Linux kernel.
Unix linux which one you choose.
uNix is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful.
```
③. キーボードで`Ctrl+D`押す (あるいは、キー入力`Control－D`)，テキストを保存し、シェルプロンプトに戻ります。

1、 `-i`マッチ時の大文字小文字は無視します：オプションにより、検索されたファイル内で文字列の大文字小文字を区別なく検索することができます。「`unix`」、「`unix`」、「`unix`」などとマッチします。

```bash
$ grep -i "UNix" geekfile.txt
```
アウトプット：
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210317235513208.png)

2、`-c`マッチパターンの行数だけ出力します: 与えられた文字列のパターンにマッチする行数を見つけることができます。

```bash
$ grep -c "unix" geekfile.txt
```
アウトプット：
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021031723583759.png)
3、`-l`パターンにマッチしたファイル名を表示します: 与えられた文字列パターンを含むファイルだけを表示することができる。

```bash
$ grep -l "unix" *
or
$ grep -l "unix" geekfile.txt f1.txt f2.txt f3.txt
```
アウトプット：
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210318000338204.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210318000528583.png)
4、`-w`匹配文件中的整个单词: デフォルトでは、grepはファイル内のサブ文字列として現れても、与えられた文字列/パターンにマッチする。grepの`-w`オプションは単語全体にのみマッチする。

```bash
$ grep -w "unix" geekfile.txt
```
アウトプット：
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210318001442469.png)

5、`-o`一致行の一致部分のみが印刷されます: デフォルトでは、grepは一致する文字列を含む行全体を表示する。`-o`オプションを使ってgrepにマッチした文字列のみを表示させることができます。

```bash
$ grep -o "unix" geekfile.txt
```

アウトプット：
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210318001746892.png)

6、`grep -n` 出力時に行番号を表示:一致する行のファイルと行番号を表示する。

```bash
$ grep -n "unix" geekfile.txt
```

アウトプット：
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210318001931593.png)

7、`-v` パターン一致を反転:`-v`オプションを使用して、指定された検索パターンに一致しない行を表示することができます。

```bash
$ grep -v "unix" geekfile.txt
```

アウトプット：
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210318002832206.png)

8、`^` 文字列で始まる行にマッチします。`^`正規表現モード行の先頭を指定します。grepでは、与えられた文字列またはパターンから始まる行にマッチするために使用することができる。

```bash
$ grep "^unix" geekfile.txt
```

アウトプット：
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210318003032279.png)

9、`$`文字列で終わる行にマッチします: `$`正規表現モードは行の最後を指定します。grepでは、与えられた文字列またはパターンで終わる行にマッチさせるために使用することができる。

```bash
$ grep "os.$" geekfile.txt
```

アウトプット：
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210318003359439.png)

10、`-e` このオプションを指定する式は、複数回使用できます：

```bash
$ grep –e "unix" –e "linux" –e "open-source" geekfile.txt
```

アウトプット：
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210318093606703.png)

11、 `-f` file 1つまたは複数のルールスタイルを含むルールファイルを指定し、grepに、1行に1つのルールスタイルでルールの条件を満たすファイル内容を検索させる。

```bash
$ cat > pattern.txt
```

```bash
Agarwal
Aggarwal
Agrawal
```

```bash
$ grep –f pattern.txt  geekfile.txt
$ grep -f pattern.txt  geekfile.txt noSuchFile.txt
```

アウトプット：
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210318094841415.png)

12、1つのファイルからn行を印刷する: `-a`結果の後に検索行とn行を印刷し、
`-b`は検索行と検索行の前n行を出力します。
`-c`は、検索行と検索行の前後n行を印刷します。

① 文法:

```bash
$ grep -A[NumberOfLines(n)] [search] [file]  
$ grep -B[NumberOfLines(n)] [search] [file]  
$ grep -C[NumberOfLines(n)] [search] [file]  
```

② 例:

```bash
$ grep -A1 learn geekfile.txt
```

③ アウトプット:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210318100126918.png)

13、`-r` ファイルが存在するディレクトリ、すなわちパスを探します：

```bash
$ grep –r "linux" ./
```

アウトプット：
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210318120030973.png)