正規表現で、●●を含む行のみを残す、●●を含む行のみを消す。

何かのログを見たり加工したりする時、以下の正規表現を良く使用しています。
本当に良く使用するものなので、VPCフローログを参考に以下内容の正規表現を書いてみます。
検証は「サクラエディタ」で行ってます。

```
●●を含む行のみを残す    ※例：「Error」行のみ取り出したい、通信拒否されてるものだけ見たい
●●を含む行のみを消す    ※例：「Infomation」行のみ要らない、NODATA行は要らない
```

目次
1 サンプルログ：VPCフローログ
2 ●●を含む行のみを残す
　2-1 「ACCEPT」を含む行のみを残す。
　2-2 「REJECT」を含む行のみを残す。
　2-3 「プライベートIPアドレス」を含む行のみを残す。
　2-4 「特定のIPアドレス」を含む行のみを残す。
3 ●●を含む行のみを消す
　3-1 「ACCEPT」を含む行のみを消す。
　3-2 「REJECT」を含む行のみを消す。
　3-3 「プライベートIPアドレス」を含む行のみを消す。
　3-4 「特定のIPアドレス」を含む行のみを消す。
4 サンプルログ内で使えそうな正規表現
　4-1 年-月-日
　4-2 時:分:秒
　4-3 ポート番号とかの数字をHITさせる場合、前後に「半角空白」を付けると楽です。

<br>


## 1 サンプルログ：VPCフローログ

動作検証用に以下のログを用意しました。
本記事の確認で利用する際はテキストファイルに移して、サクラエディタで開いてください。
<font color="Gray">※一番最後の空行までコピーしてください。</font>

```:サンプル：VPCフローログ
2021-09-19T18:43:30.000Z 2 122295887337 eni-0ffab6a423aba9790 10.0.11.4 129.250.35.250 123 123 17 1 76 1632077010 1632077041 REJECT OK
2021-09-19T18:45:05.000Z 2 122295887337 eni-0ffab6a423aba9790 192.168.11.4 194.0.5.123 123 123 17 1 76 1632077105 1632077161 REJECT OK
2021-09-19T18:46:03.000Z 2 122295887337 eni-04d996ec40472c0a8 - - - - - - - 1632077163 1632077236 - NODATA
2021-09-19T18:46:12.000Z 2 122295887337 eni-0ffab6a423aba9790 10.0.11.4 103.202.216.35 123 123 17 1 76 1632077172 1632077221 REJECT OK
2021-09-19T18:48:03.000Z 2 122295887337 eni-0ffab6a423aba9790 - - - - - - - 1632077283 1632077401 - NODATA
2021-09-19T18:48:11.000Z 2 122295887337 eni-04d996ec40472c0a8 - - - - - - - 1632077291 1632077356 - NODATA
2021-09-19T18:50:06.000Z 2 122295887337 eni-04d996ec40472c0a8 - - - - - - - 1632077406 1632077536 - NODATA
2021-09-19T18:51:30.000Z 2 122295887337 eni-0ffab6a423aba9790 10.0.11.4 172.105.204.167 123 123 17 1 76 1632077490 1632077521 REJECT OK
2021-09-19T18:51:30.000Z 2 122295887337 eni-0ffab6a423aba9790 192.168.11.4 52.119.223.48 49202 443 6 5 300 1632077490 1632077521 ACCEPT OK
2021-09-19T18:51:30.000Z 2 122295887337 eni-0ffab6a423aba9790 10.0.11.4 52.119.223.48 49204 443 6 5 300 1632077490 1632077581 ACCEPT OK
2021-09-19T18:52:46.000Z 2 122295887337 eni-0ffab6a423aba9790 10.0.11.4 124.41.72.52 123 123 17 1 76 1632077566 1632077581 REJECT OK
2021-09-19T18:52:46.000Z 2 122295887337 eni-0ffab6a423aba9790 172.31.11.4 52.119.223.48 49210 443 6 5 300 1632077566 1632077581 ACCEPT OK
2021-09-19T18:52:46.000Z 2 122295887337 eni-0ffab6a423aba9790 10.0.11.4 52.119.223.48 49212 443 6 2 120 1632077566 1632077581 ACCEPT OK
2021-09-19T18:53:13.000Z 2 122295887337 eni-04d996ec40472c0a8 - - - - - - - 1632077593 1632077656 - NODATA
2021-09-19T18:53:30.000Z 2 122295887337 eni-0ffab6a423aba9790 10.0.11.4 129.250.35.251 123 123 17 1 76 1632077610 1632077641 REJECT OK
2021-09-19T18:53:30.000Z 2 122295887337 eni-0ffab6a423aba9790 172.16.11.4 52.119.223.48 49212 443 6 3 180 1632077610 1632077641 ACCEPT OK
2021-09-19T18:54:30.000Z 2 122295887337 eni-0ffab6a423aba9790 10.0.11.4 133.18.174.255 123 123 17 1 76 1632077670 1632077701 REJECT OK
2021-09-19T18:55:13.000Z 2 122295887337 eni-04d996ec40472c0a8 - - - - - - - 1632077713 1632077836 - NODATA
2021-09-19T18:55:13.000Z 2 122295887337 eni-0ffab6a423aba9790 - - - - - - - 1632077713 1632077881 - NODATA
2021-09-19T18:58:13.000Z 2 122295887337 eni-04d996ec40472c0a8 - - - - - - - 1632077893 1632077956 - NODATA
2021-09-19T18:58:14.000Z 2 122295887337 eni-0ffab6a423aba9790 - - - - - - - 1632077894 1632078001 - NODATA
2021-09-19T19:00:07.000Z 2 122295887337 eni-04d996ec40472c0a8 - - - - - - - 1632078007 1632078137 - NODATA
2021-09-19T19:00:23.000Z 2 122295887337 eni-0ffab6a423aba9790 10.0.11.4 162.159.200.123 123 123 17 1 76 1632078023 1632078061 REJECT OK
2021-09-19T19:01:28.000Z 2 122295887337 eni-0ffab6a423aba9790 10.20.11.4 45.32.30.244 123 123 17 1 76 1632078088 1632078121 REJECT OK
2021-09-19T19:02:30.000Z 2 122295887337 eni-0ffab6a423aba9790 10.0.11.4 108.61.223.189 123 123 17 1 76 1632078150 1632078181 REJECT OK
2021-09-19T19:03:09.000Z 2 122295887337 eni-04d996ec40472c0a8 - - - - - - - 1632078189 1632078257 - NODATA
2021-09-19T19:03:30.000Z 2 122295887337 eni-0ffab6a423aba9790 10.0.11.4 129.250.35.251 123 123 17 1 76 1632078210 1632078242 REJECT OK
2021-09-19T19:05:12.000Z 2 122295887337 eni-04d996ec40472c0a8 - - - - - - - 1632078312 1632078437 - NODATA


```

<br>










## 2_●●を含む行のみを残す

### 2-1 「ACCEPT」を含む行のみを残す。
「ACCEPT」はVPCフローログで通信が許可されたもの。

```shell
# 置換前文字列
^(?!.*(ACCEPT)).*\R

# 置換後文字列
(空欄)
```

### 2-2 「REJECT」を含む行のみを残す。
「REJECT」はVPCフローログで通信拒否されたもの。

```shell
# 置換前文字列
^(?!.*(REJECT)).*\R

# 置換後文字列
(空欄)
```

### 2-3 「プライベートIPアドレス」を含む行のみを残す。

```shell
# 置換前文字列
## Class-A & B & C
### <簡易> 第1オクテットが「10, 172, 192」であるかどうかだけ見てます。
^(?!.*((10|172|192)\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})).*\R

### <詳細> 第1, 第2オクテットまでちゃんとプライベートIPかを見ます。
^(?!.*((10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|172\.(1[6-9]|2[0-9]|3[01])\.[0-9]{1,3}\.[0-9]{1,3}|192\.168\.[0-9]{1,3}\.[0-9]{1,3}))).*\R

## Class-A
### 第1オクテットが「10」であるかを見てます。
^(?!.*(10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})).*\R

## Class-B
### 第1オクテットが「172」, 第2オクテットが「16～31」であるかを見てます。
^(?!.*(172\.(1[6-9]|2[0-9]|3[01])\.[0-9]{1,3}\.[0-9]{1,3})).*\R

## Class-C
### 第1, 第2オクテットが「192.168」であるかを見てます。
^(?!.*(192\.168\.[0-9]{1,3}\.[0-9]{1,3})).*\R


# 置換後文字列
(空欄)
```

### 2-4 「特定のIPアドレス」を含む行のみを残す。

```shell
# 置換前文字列
## 「.」は正規表現の「改行を除く任意の1文字」となってしまうため「\」でエスケープする。
^(?!.*(129\.250\.35\.251)).*\R

# 置換後文字列
(空欄)
```

<br>














## 3 ●●を含む行のみを消す

### 3-1 「ACCEPT」を含む行のみを消す。
「ACCEPT」はVPCフローログで通信が許可されたもの。

```shell
# 置換前文字列
.*(ACCEPT).*\R

# 置換後文字列
(空欄)
```

### 3-2 「REJECT」を含む行のみを消す。
「REJECT」はVPCフローログで通信拒否されたもの。

```shell
# 置換前文字列
.*(REJECT).*\R

# 置換後文字列
(空欄)
```

### 3-3 「プライベートIPアドレス」を含む行のみを消す。

```shell
# 置換前文字列
## Class-A & B & C
### <簡易> 第1オクテットが「10, 172, 192」であるかどうかだけ見てます。
.*((10|172|192)\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*\R

### <詳細> 第1, 第2オクテットまでちゃんとプライベートIPかを見ます。
.*((10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|172\.(1[6-9]|2[0-9]|3[01])\.[0-9]{1,3}\.[0-9]{1,3}|192\.168\.[0-9]{1,3}\.[0-9]{1,3})).*\R

## Class-A
### 第1オクテットが「10」であるかを見てます。
.*(10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*\R

## Class-B
### 第1オクテットが「172」, 第2オクテットが「16～31」であるかを見てます。
.*(172\.(1[6-9]|2[0-9]|3[01])\.[0-9]{1,3}\.[0-9]{1,3}).*\R

## Class-C
### 第1, 第2オクテットが「192.168」であるかを見てます。
.*(192\.168\.[0-9]{1,3}\.[0-9]{1,3}).*\R


# 置換後文字列
(空欄)
```

### 3-4 「特定のIPアドレス」を含む行のみを消す。

```shell
# 置換前文字列
## 「.」は正規表現の「改行を除く任意の1文字」となってしまうため「\」でエスケープする。
.*(129\.250\.35\.251).*\R

# 置換後文字列
(空欄)
```



## 4 サンプルログ内で使えそうな正規表現

### 4-1 年-月-日

```shell
## 簡易
20[0-9]{2}-[0-9]{2}-[0-9]{2}
## 詳細 ※月は「01～12」、日は「01～31」を指定。
20[0-9]{2}-[0-1][0-9]-(0[1-9]|[1-2][0-9]|3[0-1])
```

### 4-2 時:分:秒

```shell
## 簡易
[0-9]{2}:[0-9]{2}:[0-9]{2}
## 詳細 ※時は「00～23」、分と秒は「00～59」を指定。
([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])
```

### 4-3 ポート番号とかの数字をHITさせる場合、前後に「半角空白」を付けると楽です。

```shell
# ポート番号: 443
\s443\s   ※「\s」は半角空白を含む、空白文字。タブとか改行コードにも反応する。
 443      ※前後に「半角空白を付ける」

# 詳細 ※半角空白を前後に含むけど、半角空白部分は選択されない。
(?<=^|\s)443(?= |/)
```