ファイル内の文字列検索【BashとPowerShellの比較】

[BashとPowerShellのコマンド対応表に戻る](https://qiita.com/karakuri-t910/items/c3b9a314afe18f6d0e7c)


PowerShellのやり方が、ちょっとだけ分かった。

<br>

# 対応表

| <font color="magenta">シェル</font> | <font color="magenta">スペル</font> | <font color="magenta">短縮形</font> |
| --- | --- | ---|
| **Bash** | `grep` | - |
| **PowerShell** | `Select-String` | `sls` |

<br>

# Bash

## コマンド形式

```bash
$ grep [オプション] <検索したい文字列> [ファイル名]

# [オプション]: 任意（以下は、私がよく使うオプション）
    -i: 大文字小文字の区別をしないで検索する
    -I: バイナリファイルは検索対象外にする
    -n: 検索に引っかかった個所の行番号を表示する
    -r: サブディレクトリ内にあるファイルも検索する
    -v: <検索したい文字列>に一致しないものを表示する
    -w: 完全に一致するものだけ表示する
    --exclude="*.拡張子": 指定した拡張子は検索対象外にする
    --include="*.拡張子": 指定した拡張子のみ検索対象にする

# <検索したい文字列>: 必須
途中でスペースなどを含む場合は「"文字列 文字列"」のようにダブルクォートで囲む。

# [ファイル名]: 任意（だけど必須に近い）
指定したファイル内だけを検索する。
基本的に「*（アスタリスク）：すべてのファイルを検索対象」を指定すればOK。
検索対象を絞りたい（例えばhoge.txtファイルのみ）場合だけ、具体的なファイル名を指定する。
```

### 使用例

例１）カレントディレクトリ内のすべてのファイルを対象に、 `hoge` で検索

```bash
$ grep hoge *
```

例２）カレントディレクトリ内の`hoge.txt`ファイルを対象に、`hoge` で検索

```bash
$ grep hoge hoge.txt
```

例３）サブディレクトリも含む全てのファイルも対象に、`main`で完全一致するもの検索

```bash
$ grep -rw main *
```

例４）サブディレクトリも含む全てのファイルも対象に、`main`を含まないものを検索

```bash
$ grep -rv main *
```

例５）サブディレクトリも含む全てのjsonとxmlファイル以外を対象に、`color`で検索

```bash
$ grep -r --exclude="*.json" --exclude="*.xml" color *
```

<br>





# PowerShell

* [Get-ChildItemの参考ページ](https://forsenergy.com/ja-jp/windowspowershellhelp/html/4b270d63-c995-45b8-b5b4-3f8887efbfcc.htm)
* [Get-ChildItem公式ページ（英語）](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-7)
* [Select-Stringの参考ページ](https://forsenergy.com/ja-jp/windowspowershellhelp/html/fb4a9a8a-697b-434c-a419-e3877ca643fc.htm)
* [Select-String公式マニュアル（英語）](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-string?view=powershell-7)

## コマンド形式

* カレントフォルダ内だけ検索

```powershell
> Select-String -Path <ファイル名> -Pattern '<検索したい文字列>' [オプション]

# <ファイル名>について
指定したファイル内だけを検索する。
基本的に「*（アスタリスク）：すべてのファイルを検索対象」を指定すればOK。
検索対象を絞りたい（例えばhoge.txtファイルのみ）場合だけ、具体的なファイル名を指定する。

# <検索したい文字列>について
ここに検索したいものを指定する。
必ず「シングルクォート（[Shift] + [7]）」で囲む。

# [オプション]
    -Encoding: 文字コード（Shift_JISやUTF-8など）を指定する
    -NotMatch: <検索したい文字列>に一致しないものを表示する
    -Exclude <文字列>: ファイル名に <文字列> を含むものは、検索対象外にする
    -Include <文字列>: ファイル名に <文字列> を含むものだけ、検索対象にする
```

* サブフォルダも含めて検索

```powershell
> Get-ChildItem -Path <検索したいフォルダパス> -Filter <ファイル名> -Recurse | Select-String -Pattern '<検索したい文字列>'

# -Recurseについて
サブフォルダも検索対象に含める場合に付けます。

# <検索したいフォルダパス>
どこから検索を開始するのかを指定する。
    カレントフォルダから検索: .（ドット）
    ホームフォルダから検索: ~（チルダ）または $HOME
    ルートフォルダから検索: /（スラッシュ）

# <ファイル名>について
上の「カレントフォルダ内だけ検索」と同じ。

# <検索したい文字列>について
上の「カレントフォルダ内だけ検索」と同じ。
```

### 使用例

例１）カレントディレクトリ内のすべてのファイルを対象に、 `hoge` で検索

```powershell
> Select-String -Path * -Pattern 'hoge'
```

例２）カレントディレクトリ内の`hoge.txt`ファイルを対象に、`hoge` で検索

```powershell
> Select-String -Path hoge.txt -Pattern 'hoge'
```

例３）サブディレクトリも含む全てのファイルも対象に、`main`を含むものを検索

```powershell
> Get-ChildItem -Path ./* -Filter * -Recurse | Select-String -Pattern 'main'
```

例４）サブディレクトリも含む全てのファイルも対象に、`main`を含まないものを検索

```powershell
> Get-ChildItem -Path ./* -Filter * -Recurse | Select-String -Pattern 'main' -NotMatch
```

例５）サブディレクトリも含む全てのjsonファイル以外を対象に、`color`で検索（複数ファイルは分からない）

```powershell
> Get-ChildItem -Path ./* -Filter * -Recurse | Select-String -Pattern 'color' -Exclude *.json
```