powershell

powershellでgrepを使いたい

「フォルダ内ファイルからある特定の文字列を抽出する」とか、「コマンドの結果出力をパイプでフィルタリングする」とかWindows環境でも何かとgrepコマンドを使いたくなるのですが、なかなか覚えることができないのでここにメモっておきます。

フォルダ内ファイルからある特定の文字列を抽出する

以下のようなフォルダー構成である時を例として、カレントフォルダ内のみを対象にgrepする場合と、フォルダを再帰的にgrepする場合を以下解説します。

PS D:\work> tree /f
フォルダー パスの一覧:  ボリューム ボリューム
ボリューム シリアル番号は AA52-2618 です
D:.
│  千葉県.txt
│  埼玉県.txt
│  東京都.txt
│  横浜市.txt
│
└─関東地方
    ├─北関東
    │  ├─栃木県
    │  ├─群馬県
    │  └─茨城県
    └─南関東
        ├─千葉県
        │      千葉市.txt
        │      柏市.txt
        │      流山市.txt
        │
        ├─埼玉県
        │      さいたま市.txt
        │      埼玉県.txt
        │
        ├─東京都
        │      世田谷区.txt
        │      中央区.txt
        │      千代田区.txt
        │      渋谷区.txt
        │      立川市.txt
        │
        └─神奈川県
                横浜市.txt

PS D:\work>
カレントフォルダ内のみを対象にgrep
Select-String -Path .\*.txt -Pattern "髙島屋|伊勢丹"
PS D:\work> Select-String -Path .\*.txt -Pattern "髙島屋|伊勢丹"

横浜市.txt:2:横浜 髙島屋
埼玉県.txt:1:大宮 髙島屋
埼玉県.txt:2:浦和 伊勢丹
千葉県.txt:1:流山おおたかの森 髙島屋
千葉県.txt:2:柏 髙島屋
東京都.txt:1:日本橋 髙島屋
東京都.txt:2:新宿 髙島屋
東京都.txt:3:新宿 伊勢丹
東京都.txt:4:立川 髙島屋
東京都.txt:5:立川 伊勢丹
東京都.txt:6:玉川 髙島屋

PS D:\work>
再帰的にフォルダ内をgrep

以下どちらも同じ結果になります。-Recurse オプションを使う事が肝です。

Get-ChildItem -Recurse | Select-String -Pattern "髙島屋"
Select-String -Path  ( dir -recurse .) "髙島屋"
PS D:\work> Get-ChildItem -Recurse | Select-String -Pattern "髙島屋"

横浜市.txt:2:横浜 髙島屋
埼玉県.txt:1:大宮 髙島屋
千葉県.txt:1:流山おおたかの森 髙島屋
千葉県.txt:2:柏 髙島屋
東京都.txt:1:日本橋 髙島屋
東京都.txt:2:新宿 髙島屋
東京都.txt:3:立川 髙島屋
東京都.txt:4:玉川 髙島屋
関東地方\南関東\千葉県\柏市.txt:1:柏 髙島屋
関東地方\南関東\千葉県\流山市.txt:1:流山おおたかの森 髙島屋
関東地方\南関東\埼玉県\埼玉県.txt:1:大宮 髙島屋
関東地方\南関東\東京都\渋谷区.txt:1:新宿 髙島屋
関東地方\南関東\東京都\世田谷区.txt:1:玉川 髙島屋
関東地方\南関東\東京都\中央区.txt:1:日本橋 髙島屋
関東地方\南関東\東京都\立川市.txt:1:立川 髙島屋
関東地方\南関東\神奈川県\横浜市.txt:2:横浜 髙島屋

PS D:\work>

コマンドの結果出力をパイプでフィルタリングする

パイプとgrepの組み合わせの利用シーンはかなり多いですよね。

netstat -n  | Select-String -Pattern "TIME_WAIT|ESTABLISHED"
netstat -n  | Select-String "1521"

WSL2をインストールしているのであれば

当然ですがgrepをそのまま使えるので以下のようになります。

カレントフォルダ内のみを対象にgrep
grep -s -e '髙島屋' -e '伊勢丹' *
[sooni@DESKTOP-HJ85QJ6 work]$ pwd
/mnt/d/work      ← WSLではD:を /mnt/d で表現します。
[sooni@DESKTOP-HJ85QJ6 work]$ grep -s -e '髙島屋' -e '伊勢丹' *
千葉県.txt:流山おおたかの森 髙島屋
千葉県.txt:柏 髙島屋
埼玉県.txt:大宮 髙島屋
埼玉県.txt:浦和 伊勢丹
東京都.txt:日本橋 髙島屋
東京都.txt:新宿 髙島屋
東京都.txt:新宿 伊勢丹
東京都.txt:立川 髙島屋
東京都.txt:立川 伊勢丹
東京都.txt:玉川 髙島屋
横浜市.txt:横浜 髙島屋
[sooni@DESKTOP-HJ85QJ6 work]$
再帰的にフォルダ内をgrep
grep -r '髙島屋' ./
[sooni@DESKTOP-HJ85QJ6 work]$ grep -r '髙島屋'
./千葉県.txt:流山おおたかの森 髙島屋
./千葉県.txt:柏 髙島屋
./埼玉県.txt:大宮 髙島屋
./東京都.txt:日本橋 髙島屋
./東京都.txt:新宿 髙島屋
./東京都.txt:立川 髙島屋
./東京都.txt:玉川 髙島屋
./横浜市.txt:横浜 髙島屋
./関東地方/南関東/千葉県/柏市.txt:柏 髙島屋
./関東地方/南関東/千葉県/流山市.txt:流山おおたかの森 髙島屋
./関東地方/南関東/埼玉県/埼玉県.txt:大宮 髙島屋
./関東地方/南関東/東京都/世田谷区.txt:玉川 髙島屋
./関東地方/南関東/東京都/中央区.txt:日本橋 髙島屋
./関東地方/南関東/東京都/渋谷区.txt:新宿 髙島屋
./関東地方/南関東/東京都/立川市.txt:立川 髙島屋
./関東地方/南関東/神奈川県/横浜市.txt:横浜 髙島屋
[sooni@DESKTOP-HJ85QJ6 work]$
スポンサーリンク