はしくれエンジニアもどきのメモ

情報系技術・哲学・デザインなどの勉強メモ・備忘録です。

Windows でもgrep したい

Windows でもgrep したい

Windowsでもgrep に似たコマンドを探してみたらあったのでメモ。 Chocolatey で探してみたところ、CUIベースのコマンドがなさそうなので、 デフォのコマンドを使っておくのがよさそうです。

環境

findstrコマンド

コマンドプロンプトでは、findstr が使える。 一応、オプションで検索文字列に正規表現が使える。


findstr /?

Searches for strings in files.

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file]
        [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
        strings [[drive:][path]filename[ ...]]

  /B         Matches pattern if at the beginning of a line.
  /E         Matches pattern if at the end of a line.
  /L         Uses search strings literally.
  /R         Uses search strings as regular expressions.
  /S         Searches for matching files in the current directory and all
             subdirectories.
  /I         Specifies that the search is not to be case-sensitive.
  /X         Prints lines that match exactly.
  /V         Prints only lines that do not contain a match.
  /N         Prints the line number before each line that matches.
  /M         Prints only the filename if a file contains a match.
  /O         Prints character offset before each matching line.
  /P         Skip files with non-printable characters.
  /OFF[LINE] Do not skip files with offline attribute set.
  /A:attr    Specifies color attribute with two hex digits. See "color /?"
  /F:file    Reads file list from the specified file(/ stands for console).
  /C:string  Uses specified string as a literal search string.
  /G:file    Gets search strings from the specified file(/ stands for console).
  /D:dir     Search a semicolon delimited list of directories
  strings    Text to be searched for.
  [drive:][path]filename
             Specifies a file or files to search.


fidstr [検索文字列] [path] で検索できる。


cd [探したいディレクトリ]
findstr gist *.txt # ディレクトリ内のtxtファイルからgist を検索

-rオプションで正規表現で検索。


findstr -r gist.* *.txt # 正規表現で検索

-iオプションで大文字・小文字関係なしで検索。


findstr -i gist *.txt # 大文字・小文字関係なしで検索

-nオプションで行数を表示。


findstr -n gist *.txt # 行数を表示

-sオプションで、ディレクトリ内にサブディレクトリがあれば再帰的に検索してくれる。


> findstr -n -s gist *.txt # 行数を表示

-mオプションで、ファイル名も出力。


> findstr -s -m gist *.txt # ファイル名も表示

一階層下のみの特定のファイルを検索 というのはできないようである(指定が間違ってる?)。


> findstr -n gist .\*\*.txt
FINDSTR: Cannot open .\*\*.txt

Select-Stringコマンド

Select-Stringコマンドは、PowerShell で使える。使ってみた感じ、findstr よりもファイル指定に柔軟性がある。PowerShell ISE を使うと、pathの補完も効くのでわかりやすい。

デフォでは、大文字・小文字を区別しないで検索する。

正規表現には、-Patternオプションを使う。


> Select-String -Pattern gist* *.txt

-casesensitiveオプションで、大文字・小文字を区別して検索する。


> Select-String -casesensitive gist *.txt

マッチしたファイル名のみを出力する場合、以下のコマンドでできるが、長い。。


Select-String gist *.txt | ls | Get-Unique

-Contextオプションで、検索にマッチした行の前後の行も出力する。


Select-String -Context 1,1 gist *.txt # 前の行、マッチした行、次の行を表示

パスの指定に柔軟性があるので、以下のような1階層下のすべてのサブディレクトリ内の特定のファイルでの検索もできる。


> Select-String gist .\*\*.txt

Select-Stringは長いので、 エイリアスで、grep を振っておく。


> Set-Alias grep Select-String

ただし、PowerShell を閉じると無効になるので、プロファイルに設定しておく。


notepad $profile # profileを開く

Set-Alias grep Select-String # profileに追加して保存

power shell を再起動して、Get-Aliasエイリアスの確認。


> Get-Alias

Alias           grep -> Select-String # エイリアスに登録されている!