1. ホーム
  2. スクリプト・コラム
  3. パワーシェル

PowerShellで複数ファイルからキーワードを取得する

2022-02-06 11:51:12

ここ数日、Powershellを見ていて、なかなか強力だと感じています。小さなタスクとしては、Powershellを使って、複数のファイルから1万行のレコードを取得するスクリプトを実装することです。最初はGet-ContentとWhere-Objectを組み合わせて使いたかったのですが、取得結果が遅かったり、取得したエントリを表示したときにどのファイルから来たのかわからなかったりと、こちらも簡単に実装できましたが、複数の方法を検討した結果、一つの強力なコマンドでこれらのニーズを全て、しかも超高速で実現できることに驚きました。

一般的にIISのログ解析に使われることが多く、このPSコマンドの紹介がメインなので、IISのログはサーバー側から取得しており、ここではテスト用に半分だけデータを掲載しています。

まず適当なディレクトリに移動して、カレントディレクトリのファイルを見ますが、そのうち4つのログファイルがテストに使われます。それらは以下の通りです。

そして、その強力な機能を実装するために、次のコマンドを使用するだけです。

たとえば、キーワードの書き込みを検索するには、書き込みを入力した後、検索結果は次のとおりです(傍受の唯一の部分は、ここでプライバシーに起因する、ログファイルは、データのちょうど比較的大きな量、私の創造であり、コンテンツは純粋なフィクション〜〜)です。

このステートメントを一時変数に代入すると、その瞬間にチェックアウトされたデータの量を確認することができます:。

500件のデータが4つのログファイルから瞬時に見つかりましたが、実はこれは構築したデータ量が少ないために見えていないのです。

この強力なコマンドを簡単に説明すると、次のようになります。

で説明したように、実は全部Select-Stringコマンドを使っているのです。

http://technet.microsoft.com/zh-cn/library/dd315403.aspx

Get-ChildItem は、現在のディレクトリにあるすべてのアイテムを取得し、パイプライン|入力でフィルタリングし、? (Where-Objectの別名)でフィルタリングし、カレントディレクトリのログファイルをフィルタリングする、$_はカレントオブジェクト、つまり前回のチェック結果を表す、-likeはパターンマッチを使う、$(Read-Host)はC#のReadLine ()に似たコンソールからの読み込み(対応する標準出力はWrite-Host)、つまりユーザーが ユーザーがキーワード入力するとコマンドが後ろから前へと遂行される、である。

まだ始めたばかりなので、何か間違いがあればお知らせします。