「フォルダ内ファイルからある特定の文字列を抽出する」とか、「コマンドの結果出力をパイプでフィルタリングする」とか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]$